seekg(0,ios::beg)不起作用的原因和解決方法
阿新 • • 發佈:2019-02-16
先看看出問題的程式碼片段
std::string szFileName = dir + "/SymPS.tab"; std::ifstream is; is.open(szFileName.data(),ios_base::in); if(!is.is_open()) return false; std::string message; while(!is.eof()) { std::getline(is, message); if(message[0] == '\0') continue; if(message[0]=='*') continue; } is.seekg(0, ios::beg); while(!is.eof()) { std::getline(is, message); ... }
執行過程中會發現,即使中間有is.seekg(0,ios::beg)這句話想把輸入流定位到流的開始位置,但是,根本沒有起作用,在下面的is.eof()判斷那裡,is.eof()還是返回了true。
後來查閱資料後才知道,原來前面的while迴圈while(!is.eof())執行完以後,is的eof標記就是true了,這時呼叫seekg是沒用的。
解決方法:在seekg之前需要呼叫流物件的clear方法,把流的標記清除掉,清除以後就可以正常呼叫seekg方法了。
std::string szFileName = dir + "/SymPS.tab"; std::ifstream is; is.open(szFileName.data(),ios_base::in); if(!is.is_open()) return false; std::string message; while(!is.eof()) { std::getline(is, message); if(message[0] == '\0') continue; if(message[0]=='*') continue; } is.clear(); is.seekg(0, ios::beg); while(!is.eof()) { std::getline(is, message); ... }