Дилема с fgets и feof - C (СИ)
Формулировка задачи:
Решаю проблему с файловым вводом-выводом. Нужно скопировать все строчки из одного файла и вставить в другой, добавив в каждую строку имя файла. Написал, работает. Но! В некоторых случаях программа дублирует последнюю строку. Например:
Запишу в исходный файл
F1.txt:
{
Table.
My name is Vasya
}
Результат будет будет(что и должно быть):
testRes.txt:
{
F1 :++: Table.
F1 :++: My name is Vasya
F1 :++:
F1 :++:
}
Но если в файле будет не 2 пустых строки, а одна:
F1.txt:
{
Table.
My name is Vasya
}
Результат будет такой:
testRes.txt:
{
F1 :++: Table.
F1 :++: My name is Vasya
F1 :++: My name is Vasya
}
Вот, где тут "собака зарыта"?
#define _CRT_SECURE_NO_WARNINGS
#include <locale>
int main()
{
setlocale(LC_CTYPE, "rus");
FILE *file1, *file2;
char str[200]; //Буфер в котором хранится переносимая строка
file2 = fopen("testRes.txt", "w");
file1 = fopen("F1.txt", "r");
while (!feof(file1))
{
fgets(str, 200, file1);
//fscanf(file1, "%s", str);
fprintf(file2, "%s :++: %s", "F1.txt", str);
}
printf("\n");
system("PAUSE");
}Решение задачи: «Дилема с fgets и feof»
textual
Листинг программы
while (1)
{
fgets(str, 200, file1);
if (feof(file1)) break;
fprintf(file2, "%s :++: %s", "F1.txt", str);
}
Объяснение кода листинга программы
- В цикле while(1) происходит чтение строки из файла file1 с помощью функции fgets.
- Строка сохраняется в переменной str, которая имеет размер 200 символов.
- Проверяется условие feof(file1), которое возвращает 1, когда достигается конец файла.
- Если условие истинно, то происходит выход из цикла с помощью оператора break.
- В каждой итерации цикла в файл file2 записывается строка, полученная из файла file1, с помощью функции fprintf.
- Формат записи строки включает два поля:
F1.txtи переменная str. - Значение переменной str увеличивается на два символа
++:. - Запись в файл file2 осуществляется после каждой итерации цикла, пока не будет достигнут конец файла.