在做實驗的時候遇到這個問題,找原因的時候發現出處除了講明原因,還舉了例子,所以記下來。
其實在迴圈判斷檔案是否結束的時候可以直接就流輸入放在迴圈條件那裡,但是這裡補充使用eof()的一些細節問題。其實這是關於到底什麼時候標誌位才會變化的問題。總結起來就是只有使用一次流變數來輸入輸出,標誌位才會更新一次。
正文:fstream流的eof() 判斷有點不合常理
按正常邏輯來說,如果到了檔案末尾的話 ,那eof()應返回真
但是,c++輸入輸出流如何知道是否到末尾呢?
原來是根據的是: 如果fin>>不能再讀入資料了,才發現到了檔案結尾,這時才給流設定檔案結尾的標誌,此後呼叫eof()時,才返回真。
假設fin>>x; //此時檔案剛好讀完最後乙個資料(將其儲存在x中)
但是, 這時 fin.eof()仍未假 因為,fin流的標誌eofbit是false, fin流此時認為檔案還沒有到末尾
只有當流再次讀寫時
fin>>x; 發現已無可讀寫資料,此時流才知道到達了結尾,這時才將標誌eofbit修改為true
此時流才知道了檔案到底了末尾
也就是說,eof在讀取完最後乙個資料後,仍是false,
當再次試圖讀乙個資料時,由於發現沒資料可讀了 才知道到末尾了,此時才修改標誌,eof變為true
以下例子:
1 ifstream fin("d:");在執行時 發現 test_list中的資料比文字中的資料多一行,也就是 文字中最後一行的資料寫了兩遍2 3 ofstream fout("d://t_line.txt",ios::trunc);
4 5
6 listtest_list;
7 8 tag_point test;
9 10
11 12 while (!fin.eof())
13
28 29 fin.close();
30 31
始終無法理解
現在明白了:》
再讀完最後一行後,
因為fin.eof()仍為假, 所以會繼續while迴圈
當執行到while的第乙個語句 fin>>test.x時,發現無可讀資料了,此時修改流屬性,fin.eof ()變為true
再執行 fin>>test.y; fin>>test.z;時,因為已經到檔案末尾了 ,所以 test保留了上次的值,也即test中的值為變,還是文字最後一行
的資料此時再push_back(test),壓入列表的仍是最後一行資料
由此導致了,列表中的資料比文字中的資料多一行
知道了原因 ,便很好作出修改了
修改為:
1 while ( fin>>test.x&&fin>>test.y&& fin>>test.z)這樣便沒問題了 ,當讀取完最後一行資料後,將其放入列表中,此時判斷while條件,也就是再次讀取資料,發現無資料可讀,讀取不成功 fin>>test.x返回false 由此結束迴圈。2 9 10 fin.close();
AND一些經驗
目錄 一 參考 1 程式設計師2020工作規範范文 總結 good 適合多看,程式設計師每天 每月做的事情總結了 一 目的 1 在公司來了很久了,有時候一些經驗想把記錄下來,專案 做人 等等 一 專案 1 板卡 pci2012a分為支援和不支援音效卡的 一 做人 1 不要過度依賴別人 1 有問題立馬...
一些PHP經驗
先查詢php.ini find name php.ini 得出兩個ini usr local php etc php.ini etc php.ini php i grep php.ini 檢視php載入的是哪個配置檔案,這個獲取的是系統內的php.ini 的位置。不是網頁apache載入的php.i...
python 一些經驗
最近使用python做了一些工作,記錄一下。os庫主要用來建立查詢目錄之類的,沒有複製檔案的功能,需要引用另乙個庫 shutils shutils.copy glob庫可以用來查詢檔案,支援萬用字元。處理字串很方便,split 分隔符 1 就是取最後乙個,0 是取第乙個,同樣list和元祖也一樣。正...