Я пытаюсь написать какой-нибудь код C , который добавляет строку текста в файл, а затем просто отображает его построчно.Когда я открываю файл в режиме добавления и добавляю строку, используя fprintf , строка добавляется, и я вижу ее, когда открываю файл в текстовом редакторе.Однако, когда я вызываю функцию для отображения всех строк (которая прекрасно работает до добавления нового текста), я получаю все строки до последней, за исключением новой добавленной строки.
Вот код, который я используюработать с.Первая функция просто добавляет новую строку, а вторая функция просто читает все строки. read_csv () изначально работает, когда я не добавлял никаких строк кода и только что использовал текстовый редактор для добавления своих начальных строк.
void add_record(const char* csv_filename)
{
FILE *f = fopen(csv_filename,"at");
char str="My appended line "
fprintf(f,"%s",str);
fclose(f);
}
void read_csv(const char* csv_filename)
{
FILE *f = fopen(csv_filename,"rt");
char str[MAX];
fgets(str,MAX,f);
while(!feof(f))
{ fputs(str,stdout);
fputs("\n",stdout);
fgets(str,MAX,f);
}
fclose(f);
}
Теперь я нашел два исправлениямоя проблема, но я не совсем понимаю, почему они работают.
Исправление 1: добавление дополнительного fgets () выводит пропущенную добавочную строку, когда я пытаюсь ее отобразить, однако, когда я использую ее для отображения моегоИсходный текстовый файл печатает последнюю строку дважды ... так что это не очень хорошее исправление.
fgets(str,MAX,f)
while(!feof(f))
{ fputs(str,stdout);
fputs("\n",stdout);
fgets(str,MAX,f);
}
fgets(str,MAX,f)
Исправление 2: добавление нового символа строки вместе с добавленной строкой решает проблему отлично, и все гладко.Все строки отображаются, когда я вызываю read_csv () .
char str="My appended line "
fprintf(f,"%s\n",str)
Глядя на документы для fgets () , он говорит, что читает либо до новогосимвол строки или eof достигнут (в зависимости от того, что произойдет первым), поэтому я не понимаю, почему моя добавленная строка игнорируется fgets () .
Когда fgets () достигает последней строки (которую пропускает), ситуация, которую я предполагаю, выглядит примерно так: она получает строку с " text text text eof " иэто прерывает цикл, пропуская оператор печати.Но затем, когда я использую дополнительный fgets () вне цикла while, это работает.Кроме того, когда я добавляю новую строку, а ситуация представляет собой строку типа " text text text \ n eof ", она не выходит из цикла и продолжает отображать его.
Я был бы очень признателен, если бы смог получить некоторую информацию о том, что происходит и почему эти два исправления работают.Я подозреваю, что это как-то связано с тем, что feof обнаружил eof или какие-то особенности о fgets , но я не смог найти ничего удовлетворительного в Интернете.
Большое спасибо заранее, что нашли время прочитать и ответить.