2012-10-05 17 views
2

我有一個非常簡單的代碼,其功能是鍵入程序將從中讀取數據的文件的名稱。由於該文件可能由於錯誤輸入而不正確,因此如果先前的名稱無效,控制檯將繼續要求用戶輸入名稱。有關在循環中使用ifstream的錯誤

問題是,雖然第一個do-while循環工作正常,但如果在第一個循環中第一次沒有正確鍵入文件的名稱,程序將跳過第二個while循環。但是,如果文件的名稱輸入正確,一切正常。

我想知道爲什麼程序的行爲如此。

感謝您的幫助和您的時間!

#include<iostream> 
#include<fstream> 

using namespace std; 

int main() { 
    string context; 
    int step=0,i=0; 
    ifstream fin; 

    do { 
     string filename; 
     cout << endl << "please type in the name of input file" << endl; 
     cin >> filename; 
     string filepath = "files/" + filename; 
     cout << filepath << endl; 
     fin.open(filepath.c_str()); 
    } while(!fin.is_open()); 

    while (getline(fin, context)){ 
     cout << context << endl; 
     cout << "hello" << endl; 
    } 
    fin.close(); 
    return 0; 
} 

回答

2

我認爲在第一次嘗試之後,「鰭狀」狀態可能會被污染。 爲什麼不在調用fin.open()之前嘗試調用fin.clear()。

+0

謝謝。我改變了它,它工作。 – user1582802

+0

不只*可能會被污染。正確的詞是*是*。該標準規定成功調用「open」不會改變錯誤狀態。如果它已經「不好」,它將會保持不好。所以先清除它。 –

1

你需要清除你的ifstream,它可能會被前面的文件嘗試破壞。

+0

謝謝您的回覆! – user1582802

1

從標準,

27.8.1.10
void open(const char* s, ios_base::openmode mode = ios_base::out);
呼叫rdbuf()->open(s,mode|out)。如果該函數返回空指針,則調用 setstate(failbit)。 311a

那麼這張紙條311a是什麼?

311a成功打開不會改變錯誤狀態。

雖然說明是不規範的,標準化文本說,絕對沒有什麼成功的開放確實給錯誤狀態,如果rdbuf->open()成功。該說明澄清了這一非聲明。

底線:當您在open失敗後重新調用open之前,您需要clear文件流的狀態位。