一個朋友向我請教一個程序,相關代碼如下:
string s;
vector <string> vs;
ifstream inFile("F://MyReceiveFiles//FillCompo_KP.mod", ios::in);
while (getline(inFile, s))
vs.push_back(s);
cout<<vs.size()<<endl;
inFile.close();
inFile.open("F://MyReceiveFiles//FillCompo_Line.mod", ios::in);
while (getline(inFile, s))
vs.push_back(s);
inFile.close();
cout<<vs.size()<<endl;
return 0; 她說只能打開第一個文件(即FillCompo_KP.mod),不能打開第二個文件(即FillCompo_Line.mod)。
我測試了一下這段代碼,發現確實存在這個問題,但是這段代碼看起來並沒什麼錯誤啊。我的初步判斷是在關閉文件後可能還需要什麼操作。於是我上網搜索資料,搜了一陣子,終於找到一條:關閉流並不能改變流對象的內部狀態。如果最後的讀寫操作失敗了,對象的狀態將保持爲錯誤模式,直到執行 clear 操作重新恢復流的狀態爲止。調用 clear 後,就像重新創建了該對象一樣。如果程序員需要重用文件流讀寫多個文件,必須在讀另一個文件之前調用 clear 清除該流的狀態。
因此需要在調用文件流對象的close函數後加一句代碼:inFile.clear(ios::goodbit);就可以了,代碼如下:
string s;
vector <string> vs;
ifstream inFile("F://MyReceiveFiles//FillCompo_KP.mod", ios::in);
while (getline(inFile, s))
vs.push_back(s);
cout<<vs.size()<<endl;
inFile.close();
inFile.clear(ios::goodbit);// ios::goodbit時表示無錯誤,可以繼續輸入或者操作
inFile.open("F://MyReceiveFiles//FillCompo_Line.mod", ios::in);
while (getline(inFile, s))
vs.push_back(s);
inFile.close();
cout<<vs.size()<<endl;
return 0;
參考:http://blog.csdn.net/clever101/article/details/2453924