當(dāng)輸入文件為二進(jìn)制,長度遠(yuǎn)大于4096的時候。由于文件流緩沖默認(rèn)為4095.那么假設(shè)已經(jīng)讀取了4080個字節(jié)之后,即fp_in->_cnt的值為15,再使用fread(g_buffer, 1, 20, fp_in);函數(shù)打算一次性讀出20個字節(jié)時,程序異常,fread執(zhí)行時報Access Violation.有高手幫忙解釋下嗎?按道理說,文件流緩沖中剩余長度不足的時候,應(yīng)該會自動從外存文件中一次性讀入4096個字節(jié)到緩沖中才對呀,有高手幫忙指點下嗎?
2 回答

阿晨1998
TA貢獻(xiàn)2037條經(jīng)驗 獲得超6個贊
fread在fp_in緩沖區(qū)中剩余字節(jié)為0的時候才會產(chǎn)生一個異常讓內(nèi)核去處理,內(nèi)核收到這個異常,就會讀取文件,將fp_in的緩沖區(qū)重新填滿。
也就是說:如果只剩下15個了,你要讀20個,那么就會先讀15個到g_buffer里,然后產(chǎn)生一個異常,內(nèi)核重新填滿緩沖區(qū),然后再從緩沖區(qū)里讀5個字節(jié)。

揚帆大魚
TA貢獻(xiàn)1799條經(jīng)驗 獲得超9個贊
你一頓能吃四兩飯,你現(xiàn)在已經(jīng)吃了三兩了,現(xiàn)在又有四兩擺在你的面前,你不能一次把這四兩又吃下去的。
程序同理,fread函數(shù)的原型如下:
size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
只能讀到等于buffer指向的內(nèi)存區(qū)的大小的count的。
- 2 回答
- 0 關(guān)注
- 464 瀏覽
添加回答
舉報
0/150
提交
取消