[英]Unable to compare std::ifstream to an std::string
我的代碼陷入了無限循環,因為ifile
的內容與標簽不匹配。
在調試期間,我注意到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
內容與標簽匹配並退出指向該地址的位置。
我認為問題在於流無法執行提取(由於文件中的內容),因此將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)
// ^
這將修復無限循環,但是您仍然必須放棄有關文件內部內容以及如何創建和傳遞流的更多詳細信息,以完全解決此問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.