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

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

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