Создать новый файл, содержащий все слова, отличные от последнего слова - 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;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы
- Объявляем функцию main()
- Открываем файл
1.txtдля чтения - Проверяем, что файл успешно открыт, иначе выводим сообщение об ошибке и возвращаем -1
- Перемещаем курсор в конец файла
- Создаём переменную типа char для хранения символов
- Создаём переменную типа int для хранения количества итераций цикла
- Запускаем цикл while(true), который будет искать начало последнего слова
- Внутри цикла перемещаем курсор в позицию, соответствующую текущему размеру i
- Читаем символ в позиции курсора
- Если символ равен пробелу, то выходим из цикла
- Создаём массив типа char для хранения последнего слова
- Читаем последнее слово из файла
- Заменяем последнюю точку на запятую
- Очищаем ошибку чтения файла
- Перемещаем курсор в начало файла
- Открываем файл
2.txtдля записи - Создаём массив типа char для хранения слова
- Запускаем цикл while(true), который будет читать слова из файла
- Внутри цикла проверяем, является ли последнее симвомом слова запятой
- Если да, то удаляем её
- Проверяем, является ли слово последним
- Если нет, то записываем слово в файл
- Записываем пробел в файл
- Повторяем шаги 19-24 до тех пор, пока не будет считано последнее слово
- Перемещаем курсор в конец файла
- Записываем точку в файл
- Ждем нажатия любой клавиши
- Возвращаем 0, чтобы указать, что программа успешно завершилась