C++中的fstream的getLine()方法以及存有的疑問
關於助教在上課的時候用於讀取檔案內容的getLine方法,
在今天經過一個小程式試驗得到這樣的結果,
但是至今不懂得為什麼,先記錄下來之後再去找答案
1.讀取檔案test中行的內容,程式碼是下所示
#include <iostream> #include<fstream> using namespace std; int main(){ char name[]="test.txt"; fstream fs(name,ios::in); char content[10]; if(fs.is_open()){ while(!fs.eof()){//此處為錯誤 fs.getline(content,10); cout<<content<<endl; } } return 0; }
而test.txt中的內容為
1234567
12345678902345
1234567
123456667666666666666
1231111111111111111111
!!!!!!!!!!!!!!問題:
其中內容從第2行開始就超過了10個字元的長度,然後從讀取完第二次後,發現進行讀取時,content中的內容沒有變化,也就是說讀取失敗?這是為什麼?而且這樣while迴圈條件 !fs.eof()一直是成立的,為什麼?
2.下面是同一個程式,將content的長度改變,getLine()方法的引數也改變成25,程式碼如下
#include <iostream> #include<fstream> using namespace std; int main(){ char name[]="test.txt"; fstream fs(name,ios::in); char content[25]; if(fs.is_open()){ while(!fs.eof()){ fs.getline(content,25); cout<<content<<endl; } } return 0; }
結果:
此處content內容能夠正確列印,且正確退出迴圈
3.在寫一個小程式的時候還出現過這個問題:後面發現char content[20],而fs.getLine(content,30);然後出現了這個...後面想想個那個函式的呼叫壓棧有關係吧,就是可能把返回地址給覆蓋了?【好吧,真的不懂。。。以後過來修改解釋】
總結:
雖然還是有問題不會,但是還是有些收穫的。
在使用fstream的getLine()方法時,引數一定要大於一行儲存的最長字元長度,否則會失敗;若是getLine的引數大於字元個數,那麼程式執行讀取content完畢後,會在陣列的末尾自動加上'\0';而且根據助教的寫法,while成立的條件為fs.getLine(content,25),感覺起來安全很多,至少不會因為讀取一次錯誤造成一直在迴圈...
ps:要是哪位看到了這個,能夠解釋我的疑問的話,歡迎指教。。。3Q