2017-05-13 73 views
1

它總是在最後打印一個額外的字符。這裏是代碼:fscanf在最後掃描一個額外的字符

#include <stdio.h> 

int main() 
{ 
    char bit; 
    FILE *fp_read,*fp_write; 
    fp_read = fopen("test.txt","r"); 

    if(fp_read==NULL) { 
     printf("Error!! Unable to open the file!!"); 
     return 1; 
    } 
    while(!feof(fp_read)) { 
     fscanf(fp_read,"%c",&bit); 
     printf("%c",bit); 
    } 
    fclose(fp_read); 

    return 0; 
} 

如果test.txt包含010101它打印0101011。如果00110打印001100.如果它包含abc它打印abcc。這意味着它總是重複最後一個字符。

什麼問題?有人可以解釋嗎?

+2

你需要閱讀有關[爲什麼是錯誤的使用'FEOF()'在一個文件中環路(http://stackoverflow.com/questions/5431941/why-is-while-feof-file -always-錯誤的)。 –

+0

我無法在linux上重現問題。你能提供有關env的額外信息嗎? –

+0

在同一目錄下創建一個文件:test.txt並在test.txt中寫入一些內容。 –

回答

0

我無法重現錯誤。

請參閱David Bowling在原始文章中的第一條評論以獲得一個簡潔的解釋。

cppreference page for feof的版本較短。

eof函數只報告最近I/O操作報告的流狀態,它不檢查關聯的數據源。例如,如果最新的I/O是一個fgetc,它返回文件的最後一個字節,則feof返回零。下一個fgetc失敗並將流狀態更改爲文件結束。只有feof返回非零值。 在典型用法中,輸入流處理會在出現任何錯誤時停止;然後用feof和ferror來區分不同的錯誤條件。

這意味着在while循環中使用feof可能不合適。文件中的最後一個字符可能是垃圾,並且在不同的系統中會有所不同。

請嘗試這樣做。

while(fscanf(fp_read,"%c",&bit) != EOF) {   
    printf("%c",bit); 
} 
+0

儘管可以使用'feof()'來控制文件循環,但大多數問題似乎都沒有正確執行。當然OP在這裏錯誤地使用了'feof()';在原帖中看到我的評論。 –

+1

哦,是的。這是一個非常簡潔的解釋。它很好地解釋了我引用的文本背後的邏輯。讓我把它添加到我的答案中。 – DeCoDeR