2016-06-11 127 views
0

我目前正在讓自己進入C中的fileusage。 我找到了解釋從文件中讀取字符串的代碼。然而,我真的好奇這是如何機械地工作。filePointer在while循環中自動進行?

while (!feof(fPointer)){ 
fgets(singleLine, 150, fPointer); 
puts(singleLine); 
} 

filepointer在循環結束時如何知道要進一步行?不應該在while循環結束時增加文件指針?

乾杯

+0

您需要了解更多關於文件搜索和指針移動的信息。在讀取了一定數量的字符後,'fgets'函數實際上將文件指針移動到下一行。在你的情況'150' –

+0

是不是'feof()'在'while'? – Cherubim

+0

對不起,我會編輯它。 所以基本上命令fgets自動增加文件指針? –

回答

4

約一個打開的文件甲FILE對象存儲信息,包括「當前positition」。每個讀/寫操作通過讀取/寫入多少字節來增加當前位置。這就是爲什麼你可以繼續調用fgets(或任何其他輸入函數)在一個循環中,並獲取塊,塊大塊。

同樣,您可以多次調用printf(或任何其他輸出函數)來產生輸出,並且它們不會相互覆蓋。

你可以使用ftellfseek(受到一些限制,例如,標準C不要求ftell回到實際字節的文本文件偏移,只是一些「幻數」可以設置當前文件位置傳遞給fseek(但我從來沒有在真正的實現中看到過))。

(你fPointer只是指向一個FILE對象不應該增加此指針,這隻會指向隨機內存。)

最後,while (!feof(fp))是錯誤的,因爲feof查詢「文件結束」的位存儲在FILE對象中。它不預測下一次讀取是否會由於到達文件末尾而失敗。輸入函數到達文件結尾後,「文件結束」位僅設置爲真。這種類型的循環將在文件結束後再次運行,然後處理垃圾(或從先前的迭代中過時)數據。