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

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

<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 печатается дважды.

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

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

 Joe Lewis13 апр. 2012 г., 15:12
Решено, спасибо за @NeilTownsend
 Eregrith13 апр. 2012 г., 15:33
Не приводите тип возврата вашего malloc (смотритеhere знать почему).

Ответы на вопрос(6)

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

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 ().

#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

Решение Вопроса

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

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

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

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

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

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

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

Ваш ответ на вопрос