C語言常見小錯誤- wb+ 讀取失敗
wb+ 文件打開模式的一種,表示以文件處于?二進制讀寫?模式
C 語言是一門簡單但復(fù)雜的語言,這話聽起來可不矛盾。C 語言語法簡單,容易上手,但越學(xué)越覺得難,要求編程者擁有較強的邏輯能力,龐大的 C 語言基礎(chǔ)知識儲備,同時還要有一定的英語基礎(chǔ)( 查詢英文文檔或閱讀外國網(wǎng)友解決bug的辦法?),以及——無處不在的細節(jié)!
如果你正在寫一個項目,可能遭遇過被 wb+ 折磨的時刻,特別是調(diào)試代碼的時候,你會覺得是不是自己學(xué)了個假 C 語言。以上的問題所在,全都是一個原因,沒有閱讀官方文檔,在 C 17 草案中,發(fā)現(xiàn)了一個關(guān)鍵信息:

Note that a file positioning function may further modify the file position indicator after discarding any pushed-back
characters.
注意:在丟棄任何 推回(pushed-back) 字符之后,文件定位函數(shù)可能進一步修改文件位置標識(indicator)。
前半句看不懂沒關(guān)系,因為我也不懂,后半句看懂就可以了——“文件定位函數(shù)可能進一步修改文件位置標識”。結(jié)合原文給出的信息,我得到一個假設(shè):一般情況下寫入文件后,文件標識 (indicator)被移動到了末尾,假如使用 fread()進行讀取,那什么也得不到。

廢話不多說,我們使用生成臨時文件函數(shù) tmpfile()?[<stdlib.h>] 作為講解目標。第一步,使用 tmpfile() 得到一個臨時文件,然后寫入一些數(shù)據(jù);第二步,使用 fread() 函數(shù)讀取文件內(nèi)容;
結(jié)果為:
結(jié)果顯示,寫入數(shù)據(jù)后,indicator 確實位于末尾處,那么使用 fread() 確實也什么得不到。
我們將 indicator 移動到文件首部,然后再試一遍。rewind()?[<stdlib.h>]?函數(shù),作用是將位置移動到首部。
結(jié)果表明確實如此:
通過測試,發(fā)現(xiàn)假設(shè)與實際情況吻合(確信)。所以操作文件時,一定要注意 indicator 處于的位置。否則,鬧出笑話,可不好了~