1. 程式人生 > >C++中的fstream的getLine()方法以及存有的疑問

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