ifstream多次讀取文件

 一個朋友向我請教一個程序,相關代碼如下:
       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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章