fscanf читает строку, которой нет в файле - PullRequest
1 голос
/ 05 ноября 2011

Я на компьютере с Fedora 15 и у меня есть простой код, который выглядит следующим образом

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int x[50], y[50];
    int i;
    FILE *f_in = fopen("readtest.dat","r");

    if (f_in == NULL) printf("No file...\n");
    else
    {
        i = 0;
        while (!feof(f_in))
        {
            fscanf(f_in,"%d %d",&x[i],&y[i]);
            printf("%d %d\n", x[i], y[i]);
            i++;
        }
        printf("I've read %d data.\n", i);
    }
return 0;
}

Файл, который нужно прочитать, это

1   1
2   2
3   3
4   4
5   5

Но я неНе знаю, почему вывод выглядит так.

1   1
2   2
3   3
4   4
5   5
1250259108 1250140145
I've read 6 data.

Я думал, что оставил пустую новую строку в файле, но я не сделал.Я дважды проверил файл с помощью gedit и vim, и пустых строк не было найдено.Почему я читаю эту несуществующую строку?

Ответы [ 3 ]

3 голосов
/ 05 ноября 2011

Как пользователь786653 сказал (по крайней мере, по ссылке) в своем комментарии, "while! Feof" - это неправильный способ чтения файла в C. конец файла, и на самом деле пытался прочитать мимо него. Таким образом, ваша программа выполняет дополнительное чтение, которое не выполняется.

3 голосов
/ 05 ноября 2011

Возможно, последний вызов функции fscanf не удался.

Эти функции возвращают количество назначенных элементов ввода. Это может быть меньше предусмотренного или даже нулевого в случае совпадения отказ.

Проверьте возвращаемое значение перед печатью. Что-то вроде:

v = fscanf(f_in,"%d %d",&x[i],&y[i]);
if (v) {
    // printf goes here
}
0 голосов
/ 05 ноября 2011

Вы должны включить в свою fscanf

fscanf(f_in,"%d %d\n",&x[i],&y[i]);

новый символ перехода на новую строку. Также не забудьте fclose ваш файл

РЕДАКТИРОВАТЬ

Я попробовал и вот результаты.

Без \n

1 1
2 2
3 3
4 4
5 5
-1216418984 1
I've read 6 data.

С \n

1 1
2 2
3 3
4 4
5 5
I've read 5 data.
...