Вопрос по c – Чтение файла C, чтение дополнительной строки, почему?

4

Я не знаю точно, почему указатель файла читает дополнительную строку из файла, в частности, последнюю строку, вот код:

<code>FILE *fp ;
fp = fopen ("mac_ip.txt", "r") ;
int mac;
char *ip = (char *) malloc(15);

while(!feof(fp)){
    fscanf(fp,"%i",&mac);
    fscanf(fp,"%s",ip);

    printf("MAC: %i\n",mac);
    printf("IP: %s\n",ip);  
}
</code>

и файл имеет ровно 20 строк, но строка 20 печатается дважды.

Какая ошибка?

Заранее спасибо.

Решено, спасибо за @NeilTownsend Joe Lewis
Не приводите тип возврата вашего malloc (смотритеhere знать почему). Eregrith

Ваш Ответ

6   ответов
5

feof не "знает" он находится в конце файла, пока вы не попытаетесь прочитать что-то еще. посколькуfscanf скажет вам, сколько предметов он получил, вы можете использовать этот простой трюк:

    if (fscanf(fp,"%i%s", &mac, ip) != 2) break;
    printf("MAC: %i\n",mac);
    printf("IP: %s\n",ip);  
}
@wildplasser Спасибо, теперь это исправлено.
fscanf () возвращает -1 в EOF, что соответствует true.
Большое спасибо, вы приняли решение. Теперь это идеально. Спасибо ;) Joe Lewis
0

ата. Могу поспорить, что на последней итерации вашего цикла вызовы fscanf завершатся неудачно, и вы напечатаете последние возвращенные результаты.

0
FILE *fp ;
int mac;
char ip[15];

fp = fopen ("mac_ip.txt", "r") ;
if (!fp) return;

while(1){
    if (fscanf(fp,"%i",&mac) < 1) break;
    if (fscanf(fp,"%s",ip) < 1) break;

    printf("MAC: %i\n",mac);
    printf("IP: %s\n",ip);  
}
fclose (fp);

. Используя возвращаемое значение, вам не нужна функция eof (). Кстати, я не думаю, что вы можете прочитать MAC-адрес в int. Может быть, вам тоже нужно прочитать это в строку?

Объяснение: feof () не делает то, что ожидает OP.feof() should only be inspected after one of the file operations failed. В большинстве случаев вам не нужна функция feof ().

6

али EOF. Так что цикл продолжается. На следующем проходе цикла fscanf фактически не читает последнюю строку во второй раз, как кажется, fscanfs завершается ошибкой, но printfs выводит значения из предыдущего прохода цикла.

2

как вы выполнили два чтения в двадцатой строке, вы попали в конец файлаbut система не знает этого. feof сработает только тогда, когда вы попытаетесь пройти конец файла, а не когда вы точно на нем ...

Кроме того, у вас может быть конец строки (CR или CR-LF) на 20-й строке, который будет пропущен только при следующей попытке чтения.

Решение состоит в том, чтобы прочитать строку за один раз (для этого есть специальная команда C), а затем проанализировать ее, чтобы получить ваши данные. Если чтение всей строки завершится неудачно, значит, вы дошли до конца.

хорошо, это объяснение заставило меня задуматься. Решаемые. Joe Lewis
Вы также можете просто выполнить while (fscanf (fp, & quot;% i% s & quot ;, & amp; mac, ip) == 2) printf (...) :)
Да, хорошая альтернатива.
1

#include <stdio.h>

int main(void)
{
    char buffer[256];
    FILE * myfile;

    myfile = fopen("some.txt","r");

    while (!feof(myfile))
    {
        fgets(buffer,256,myfile);
        printf("%s",buffer);
    }

    fclose(myfile);

    return 0;
}

от

http://www.friedspace.com/feof.html

Похожие вопросы