神奇好望角 The Magical Cape of Good Hope

          庸人不必自擾,智者何需千慮?
          posts - 26, comments - 50, trackbacks - 0, articles - 11
            BlogJava :: 首頁 ::  :: 聯(lián)系 :: 聚合  :: 管理
          C 庫函數(shù) feof(FILE*) 判斷文件末尾的問題 A Problem on Using C Library Function feof(FILE*) to Judge The End of A File
            我用 C 寫了一個程序讀取 32768 字節(jié)大小的文件,每次讀 16 個字節(jié),應(yīng)該是 2048 次讀完。但結(jié)果讀了 2049 次,并且最后兩次的數(shù)據(jù)相同,似乎重復(fù)讀取了最后 16 個字節(jié)。源代碼如下:     I wrote a program with C, which read a file of 32768 bytes, 16 bytes each time, and it should finish reading after 2048 times. But the reault was it read 2049 times, and the data of last two times are the same, which seemed the last 16 bytes were read twice. Here is the code:
          1. int loop = 0;
          2. while (!feof(file)) {
          3.     loop++;
          4.     fread(buffer, 16, 1, file);
          5.     ......
          6. }
          7. printf("%d\n", loop);    // 2049
            我看了一陣,發(fā)現(xiàn)導(dǎo)致這個錯誤的原因是 feof(FILE*) 判斷文件末尾的機(jī)制:文件指針在文件末尾的時(shí)候,除非再讀一次導(dǎo)致發(fā)生 I/O 錯誤,feof(FILE*) 依然返回 0。因此用 feof(FILE*) 作為判斷條件的 while 循環(huán)始終會多讀一次,而最后一次的讀取是失敗的,buffer 也就沒有改變,看起來就像是重復(fù)讀了一次。     I reviewed it for a whil and found the reason that produced this error is the mechanism feof(FILE*) used to judge the end of a file: When the file pointer is at the end of a file, feof(FILE*) still returns 0 unless reads one more time to course a I/O error. Therefore, a while loop using feof(FILE*) as the judgment condition always reads one more time, and the last time of reading will fail, so buffer stayed unchanged which looked like it repeated reading once.
            用下面的代碼就沒問題了:     Use the code below to solve this problem:
          1. int loop = 0;
          2. while (fread(buffer, 16, 1, file) == 1) {
          3.     loop++;
          4.     ......
          5. }
          6. printf("%d\n", loop); // 2048

          評論

          # 關(guān)于feof(FILE*)  回復(fù)  更多評論   

          2008-11-03 19:33 by friend
          其實(shí)可以在循環(huán)體內(nèi)加上一句:
          if(feof(file))break;
          我估計(jì)就行了。

          # re: C 庫函數(shù) feof(FILE*) 判斷文件末尾的問題[未登錄]  回復(fù)  更多評論   

          2014-10-31 17:52 by barry
          上面結(jié)論是對的,但下面的代碼也是有問題的,

          int loop = 0;
          while (fread(buffer, 16, 1, file) == 1) {
          loop++;
          ......
          }
          printf("%d\n", loop); // 2048

          應(yīng)該改成:
          int loop = 0;
          while (fread(buffer, 16, 1, file) !=1) {
          loop++;
          ......
          }
          printf("%d\n", loop); // 2048

          if(feof(file)==EOF)
          ....
          if(ferror(file))
          ....

          # re: C 庫函數(shù) feof(FILE*) 判斷文件末尾的問題[未登錄]  回復(fù)  更多評論   

          2014-10-31 17:59 by barry
          @barry

          sorry,

          while (fread(buffer, 16, 1, file) !=1
          應(yīng)該還是
          while (fread(buffer, 16, 1, file) ==1
          只是最后結(jié)束循環(huán)次數(shù)未必一定是2048

          因?yàn)榧词沟扔?,也可能是出錯的情況之一,這時(shí)候循環(huán)不會停止。
          如果要求出錯馬上退出,只能在循環(huán)中判斷。

          # re: C 庫函數(shù) feof(FILE*) 判斷文件末尾的問題[未登錄]  回復(fù)  更多評論   

          2014-10-31 18:28 by barry
          尤其是塊數(shù)是N,而不是1的情況下,這樣寫更有意義
          while (fread(buffer, 16, N, file) ==N

          最后結(jié)束的時(shí)候,返回的塊數(shù)大多數(shù)情況下會小于N,這個時(shí)候,也有可能是因?yàn)槌鲥e,沒有讀完N就出來了,或者到文件尾,剩下的塊小于N,也跑出來。

          后面要檢測不同結(jié)果,因?yàn)樽罱K循環(huán)結(jié)束,未必是文件讀完了。

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 澜沧| 卓尼县| 尖扎县| 鹤峰县| 吉木乃县| 视频| 托里县| 鄂尔多斯市| 屏南县| 会同县| 乐清市| 外汇| 罗甸县| 蕲春县| 新巴尔虎右旗| 宣城市| 宝鸡市| 原平市| 株洲县| 汽车| 宁波市| 邓州市| 华亭县| 农安县| 称多县| 佛教| 张家口市| 峡江县| 济阳县| 西华县| 文登市| 商水县| 邹平县| 秭归县| 漳浦县| 大石桥市| 榆社县| 和田县| 郎溪县| 葫芦岛市| 临安市|