2015-05-01 4 views
2

В следующем C -коде я открываю файл с именем test.txt, который содержит несколько строк. Затем я читаю эти строки в цикле while и печатаю их до stdout. Впоследствии я делаю несколько изменений в файле, например. добавив к нему номер 42. Затем я хочу распечатать содержимое измененного файла до stdout, но я, кажется, что-то там не вижу. Вот мой код до сих пор (излишне комментировал):Открыть файл, распечатать на стандартный вывод, добавить в файл и снова распечатать на stdout

#include <stdio.h> 
#include <stdlib.h> /* for exit() */ 

main() 
{ /* Declare variables */ 
    FILE *file_read; 
    char file_save[100]; 
    int number = 42; 

    /* Open file */ 
    file_read = fopen("/home/chb/files/Cground/test.txt", "a+"); 

    /* Check if file exists. */ 
    if (file_read == NULL) { 
     fprintf(stderr, "Cannot open file\n"); 
     exit(1); 
    } 

    /* Print what is currently in the file */ 
    printf("This is what is currently in the file:\n"); 
    while(fgets(file_save, 100, file_read) != NULL) { 
    printf("%s", file_save); 
    } 

    /* Change the contents of the file */ 
    fprintf(file_read, "%d\n", number); 

    /* Print what is in the file after the call to fscanf() */ 
    printf("This is what is now in the file:\n"); 
    /* Missing code */ 
    fclose(file_read); 
} 

Кажется, что простой, а петля находится там, где Missing code есть, похожий на тот, уже использовавшегося до этого не будет достаточно. Может кто-нибудь объяснить, что происходит. Я не против технических соображений!

+3

Вы должны позвонить fseek (file_read, 0, SEEK_SET); сначала, чтобы снова вернуться к началу файла. –

+0

Вы опубликовали бы это как реальный ответ? (Отличное имя, кстати!) –

+0

хорошо, сделано! (Ха-ха, да спасибо!) –

ответ

1

Для того, чтобы прочитать файл с самого начала вы снова должны вызвать FSEEK() первый, как так

fseek(file_read, 0, SEEK_SET); 

это устанавливает индикатор положения потока обратно в начало файла.

См. http://www.cplusplus.com/reference/cstdio/fseek/ для получения дополнительной информации.

1

Вы не установили верный указатель файла. Поскольку это уже в конце файла, читать больше нечего. Перед повторным чтением файла, сделайте следующее:

rewind(file_read); //before the "missing code" comment 

, чтобы установить его в начале файла.

+0

Спасибо. Я выбрал решение @ pfannkuchen_gesicht после того, как прочитал [fseek vs rewind] (https://stackoverflow.com/questions/11839025/fseek-vs-rewind). Преимущество Fseek заключается в возвращении успеха, который 'rewind()' не делает. –

+0

Согласитесь, 'fseek' имеет это преимущество перед' rewind'. –

Смежные вопросы