2016-04-20 3 views
-1

Я пытаюсь прочитать файл из моего .cpp-файла. Я использую библиотеки C, поэтому не путайте их.fgets только чтение первой строки файла

Таким образом, проблема такая же ясная, как и то, что я сказал в названии. Метод fgets может читать первую строку, но когда дело доходит до второй строки, она не может читать ни вторую строку, ни остальную часть файла (так как она выходит, когда возникает проблема).

Вы можете найти соответствующую часть кода:

void read_input() 
{ 
     int i = 0, N = 5; 
    char str[STR_SIZE], line[STR_SIZE]; 
    FILE *fp; 

    fp = fopen("out", "r"); 
    if (!fp) 
    { 
     fprintf(stderr, "error: file could not be opened\n"); 
     exit(1); 
    } 

    for (i = 0; i<2; i++) 
    { 
     if (fgets(str, STR_SIZE, fp) == NULL) 
     { 
      fprintf(stderr, "error: failed at file reading\n"); 
      exit(1); 
     } 

     if (feof(fp)) 
     { 
      fprintf(stderr, "error: not enough lines in file\n"); 
      exit(1); 
     } 

     if ((sscanf(str, "%s", line) != 1)) 
     { 
      fprintf(stderr, "error: invalid file format\n"); 
      exit(1); 
     } 
     printf("%d\t%s\n", i, line); 
     fclose(fp); 
    } 
} 
+0

'он не может прочитать' ... любезно объяснить. –

+0

Исправлено, извините! –

+1

Сколько строк в файле? Какие программы выводятся? – fluter

ответ

6

Я считаю, что проблема есть, потому что вы использовали fclose(fp); внутри цикла. Таким образом, после самой первой итерации fp передается fclose() и для любого повторного использования fp в любой последующей итерации будет вызываться undefined behavior, так как fp не является действительным.

Решение: Переместите fclose(fp); вне петли.

+0

S *** t! Спасибо, какая глупая ошибка! –

+0

@ KutayDemireren, если вы используете 'fstream', он закроет себя; -P. –

+0

Hahaha Я попробую в следующий раз. Спасибо :) –

3

Вы закрываете файл в цикле! Поместите flose вне петли.

for (i = 0; i<2; i++) 
{ 
    .... 
    printf("%d\t%s\n", i, line); 
    fclose(fp); // <-- here, move out of the loop. 
} 
+0

S *** t! Спасибо, какая глупая ошибка! –