Почему добавление символа \ n при добавлении позволяет распечатать последнюю добавленную строку? - PullRequest
0 голосов
/ 24 марта 2019

Я пытаюсь написать какой-нибудь код 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 , но я не смог найти ничего удовлетворительного в Интернете.

Большое спасибо заранее, что нашли время прочитать и ответить.

...