2013-10-12 99 views
0

由於ifile的內容與標籤不匹配,我的代碼陷入了無限循環。無法將std :: ifstream與std :: string進行比較

在調試過程中,我注意到ifile的內容是整個文件的字符串。

void Experiment::read_moveTo(ifstream* ifile, string label) { 
    string temp; 

    while (temp.compare(label) != 0 and ifile) { 
     *ifile >> temp; 

     if (ifile->eof()) { 
      cout << "Read error: Could not find label '" 
       << label << "' while reading parameter file '" 
       << parameterFile << "'" << endl; 
      exit(0); 
     } 
    } 
} 

我希望ifile內容與標籤匹配並退出指向該地址。

+0

我們需要比此更多的信息。向我們顯示文件的內容。 – 0x499602D2

+0

另外,告訴我們如何創建流指針並將其發送給方法。 – 0x499602D2

回答

0

我認爲問題在於流無法執行提取(由於文件中有任何內容),因此std::ios_base::failbit已設置爲流狀態。這意味着流中的任何後續I/O操作都不會執行任何操作。

你只爲循環的突破的條件是,你檢查指針的初始條件:

while (temp.compare(label) != 0 and ifile) 
//         ^^^^^ 

,並在您檢查檔案結尾的狀態:

if (ifile->eof()) 

假設在調用此函數之前輸入失敗(無論是文件無法打開還是事先執行了無效讀取),這兩種情況都無法充分檢查流。第一個條件簡單地檢查指針是否爲非零值,如果指針未設置爲NULL(我在此假設),則爲true。第二個條件始終爲false,因爲該流不能再執行任何會導致設置std::ios_base::eofbit的操作。

您需要取消引用while循環的指針,以便流的狀態可以檢查:

while (temp.compare(label) != 0 and *ifile) 
//        ^

這將解決這個無限循環,但你還是放棄更詳細的有關文件裏有什麼以及如何創建並傳遞流以完全解決此問題。

相關問題