Вопрос по c – Чтение файла 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 печатается дважды.
Какая ошибка?
Заранее спасибо.
feof
не "знает" он находится в конце файла, пока вы не попытаетесь прочитать что-то еще. посколькуfscanf
скажет вам, сколько предметов он получил, вы можете использовать этот простой трюк:
if (fscanf(fp,"%i%s", &mac, ip) != 2) break;
printf("MAC: %i\n",mac);
printf("IP: %s\n",ip);
}
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 ().
как вы выполнили два чтения в двадцатой строке, вы попали в конец файлаbut система не знает этого. feof сработает только тогда, когда вы попытаетесь пройти конец файла, а не когда вы точно на нем ...
Кроме того, у вас может быть конец строки (CR или CR-LF) на 20-й строке, который будет пропущен только при следующей попытке чтения.
Решение состоит в том, чтобы прочитать строку за один раз (для этого есть специальная команда C), а затем проанализировать ее, чтобы получить ваши данные. Если чтение всей строки завершится неудачно, значит, вы дошли до конца.