Создать новый файл, содержащий все слова, отличные от последнего слова - C (СИ) (75444)

Узнай цену своей работы

Формулировка задачи:

Дан текстовый файл, содержащий последовательность слов. Между соседними словами – запятая, за последним словом – точка. Создать новый файл, содержащий все слова, отличные от последнего слова.
#include <string.h>
#include<stdio.h>
 
int main()
{
 FILE* fin = fopen("1.txt", "r"); // открываем файл для чтения
  
 fseek(fin, 0, SEEK_END); // курсор в конце файла
 
 if (fin == 0) printf("Error!\n");
 else
 {
     char ch;
     int i = 2;   
     while (true) // находим начало последнего слова
     {
            fseek(fin, -i, SEEK_CUR); 
            
            ch = fgetc(fin);// читаем символ в позиции курсора
            if (ch == ' ')  break; // если пробел
     }
 
        char word[30];
        fscanf(fin, "%s", word); // читаем последнее слово
        word[strlen(word) - 1] = ','; // заменяем точку на запятую
        
        clearerr(fin);
        fseek(fin, 0, SEEK_SET); // курсор в начало
        
        FILE* fout = fopen("2.txt", "w"); // открываем файл для записи
 
        char str[30];
        while(true)
        {
            fscanf(fin, "%s", str); // читаем слова
            
            if (feof(fin)) break;   // если последнее слово считано, то выход
            if (strcmp(str, word))  // если слово не равно последнему, то записываем в файл
            {
                fputs(str, fout);
                fputc(' ', fout);
            }
        }
        fseek(fout, -2, SEEK_CUR);
        fputc('.', fout);
 }
     
 getchar();
 return 0;
}
Программа работает, но выдает неправильный результат. Помогите пожалуйста разобраться!

Решение задачи: «Создать новый файл, содержащий все слова, отличные от последнего слова»

textual
Листинг программы
#include <string.h>
#include<stdio.h>
 
int main()
{
    FILE* fin = fopen("1.txt", "r"); // открываем файл для чтения
  
    if (fin == 0) 
    {
        printf("Error: cant open file for read!\n");
        return -1;
    }
 
    fseek(fin, 0, SEEK_END); // курсор в конце файла
 
    char ch;
    int i = 2;   
    while (true) // находим начало последнего слова
    {
        fseek(fin, -i, SEEK_CUR); 
            
        ch = fgetc(fin);// читаем символ в позиции курсора
        if (ch == ' ')  break; // если пробел
    }
 
    char word[30];
    fscanf(fin, "%s", word); // читаем последнее слово
    
    word[strlen(word) - 1] = '\0'; // заменяем точку на запятую
        
    clearerr(fin);
    fseek(fin, 0, SEEK_SET); // курсор в начало
        
    FILE* fout = fopen("2.txt", "w"); // открываем файл для записи
 
    char str[30];
    while(true)
    {
        fscanf(fin, "%s", str); // читаем слова
        if(str[strlen(str) - 1] == ',')
            str[strlen(str) - 1] = '\0';
            
        if (feof(fin)) break;   // если последнее слово считано, то выход
        if (strcmp(str, word))  // если слово не равно последнему, то записываем в файл
        {
            fputs(str, fout);
            fputc(' ', fout);
        }
    }
    fseek(fout, -1, SEEK_END);
    fputc('.', fout);
     
    getchar();
    return 0;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы
  2. Объявляем функцию main()
  3. Открываем файл 1.txt для чтения
  4. Проверяем, что файл успешно открыт, иначе выводим сообщение об ошибке и возвращаем -1
  5. Перемещаем курсор в конец файла
  6. Создаём переменную типа char для хранения символов
  7. Создаём переменную типа int для хранения количества итераций цикла
  8. Запускаем цикл while(true), который будет искать начало последнего слова
  9. Внутри цикла перемещаем курсор в позицию, соответствующую текущему размеру i
  10. Читаем символ в позиции курсора
  11. Если символ равен пробелу, то выходим из цикла
  12. Создаём массив типа char для хранения последнего слова
  13. Читаем последнее слово из файла
  14. Заменяем последнюю точку на запятую
  15. Очищаем ошибку чтения файла
  16. Перемещаем курсор в начало файла
  17. Открываем файл 2.txt для записи
  18. Создаём массив типа char для хранения слова
  19. Запускаем цикл while(true), который будет читать слова из файла
  20. Внутри цикла проверяем, является ли последнее симвомом слова запятой
  21. Если да, то удаляем её
  22. Проверяем, является ли слово последним
  23. Если нет, то записываем слово в файл
  24. Записываем пробел в файл
  25. Повторяем шаги 19-24 до тех пор, пока не будет считано последнее слово
  26. Перемещаем курсор в конец файла
  27. Записываем точку в файл
  28. Ждем нажатия любой клавиши
  29. Возвращаем 0, чтобы указать, что программа успешно завершилась

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.75 из 5
Похожие ответы