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

Note that a file positioning function may further modify the file position indicator after discarding any pushed-back
characters.
注意:在丟棄任何 推回(pushed-back) 字符之后,文件定位函數(shù)可能進(jìn)一步修改文件位置標(biāo)識(shí)(indicator)。
前半句看不懂沒關(guān)系,因?yàn)槲乙膊欢蟀刖淇炊涂梢粤恕拔募ㄎ缓瘮?shù)可能進(jìn)一步修改文件位置標(biāo)識(shí)”。結(jié)合原文給出的信息,我得到一個(gè)假設(shè):一般情況下寫入文件后,文件標(biāo)識(shí) (indicator)被移動(dòng)到了末尾,假如使用 fread()進(jìn)行讀取,那什么也得不到。

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