2012-04-13 39 views
4

我不知道爲什麼一個文件指針從文件中讀取一個額外的行,特別是最後一行,這裏是代碼:讀一個C文件,多讀一行,爲什麼?

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); 
} 

和文件恰好有20條線,但線20條,打印兩次。

這是哪個錯誤?

在此先感謝。

+0

解決了,感謝@NeilTownsend – 2012-04-13 13:12:46

+0

勿投的malloc的返回類型(看[這裏](HTTP ://stackoverflow.com/q/605845/1151654)知道爲什麼)。 – Eregrith 2012-04-13 13:33:57

回答

2

在完成了第二十行的兩次讀取之後,您已經到了文件末尾但是系統不知道這一點。 feof只會在你試圖超越文件末尾時纔會觸發,而不是當你剛好在它上面時...

另外,你可能在第20行有一個行尾(CR或CR-LF)它只會通過另一次嘗試閱讀而過去。

解決方案是一次性讀取該行(爲此具有特定的C命令),然後解析該行以獲取數據。如果全線閱讀失敗,那麼你已經到了最後。

+0

好的,這個解釋讓我想起了。解決了。 – 2012-04-13 13:10:04

+1

你也可以只做(fscanf(fp,「%i%s」,&mac,ip)== 2)printf(...):) – svinja 2012-04-13 13:12:39

+0

是的,不錯的選擇。 – 2012-05-10 18:31:10

6

因爲讀完最後兩個值後,仍然沒有命中EOF。所以循環繼續。在循環的下一個循環中,fscanf實際上並沒有像第二次讀取最後一行那樣,fscanfs失敗,但printfs輸出循環的前一個循環中的值。

5

feof不知道它在文件的末尾,直到您嘗試閱讀更多。由於fscanf告訴你有多少項目是有,你可以使用這個簡單的一招:

for(;;){ 
    if (fscanf(fp,"%i%s", &mac, ip) != 2) break; 
    printf("MAC: %i\n",mac); 
    printf("IP: %s\n",ip); 
} 
+0

非常感謝,你讓我的主意。現在它是完美的。謝謝;) – 2012-04-13 13:11:27

+0

fscanf()在EOF上返回-1,其值爲true。 – wildplasser 2012-04-13 13:16:03

+0

@wildplasser謝謝,現在已修復。 – dasblinkenlight 2012-04-13 13:27:49

0

您更好的測試打印結果之前的fscanf返回值。我敢打賭,在循環的最後一次迭代中,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); 

fscanf()返回它分配的數量mad(或者eof上的-1)。通過使用返回值,您不需要eof()函數。順便說一句,我不認爲你可以讀取一個MAC地址到一個int。也許你需要將它讀入一個字符串呢?

說明:feof()不執行OP所期望的操作。 feof()應該只在其中一個文件操作失敗後才被檢查。在大多數情況下,您不需要feof()。

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