2012-03-05 25 views
0

我知道這已被問及前幾次,我讀了與它有關的線程,但那裏的解決方案沒有爲我工作。倒帶ifSteam在C++

ifstream myFile; 

myFile.open("largefile.txt"); 

    if (myFile.is_open()) 
     { 
      while (!myFile.eof()) //step through each line until end of file 
      { 
       myFile>> str; 
       if(str.size() < 5){ 
        amount++; 
       } 
      } 
     } 

    myFile.seekg(0, ios::beg); 

if (myFile.is_open()) 
     { 
      for(int i=0; i != random_integer; i++) //step through each line until random line reached 
      { 
       myFile>> str; 
       if(i == random_integer-1){ 
       cout << "\n"; 
       cout << str; 
       cout << "\n"; 
       cout << str.size(); 
       } 
      } 
     } 
     myFile.close(); 

我讀過在while語句中使用EOF是一個壞主意,最新的選擇是什麼?而且我怎麼才能倒回第二個循環,因爲seekg沒有工作,我不想關閉文件並再次打開,並且文件大到可以真正讀入數組?我敢肯定,這是一個簡單的解決方案,我只是對C++很陌生。

+0

如果蒸了,那麼可能有些火了。 – Benoit 2012-03-05 15:37:18

回答

1

myFile >> str不能保證剛工作因爲你檢查了文件的結尾,因爲這是一個只在EOF被讀取時設置的標誌,而不是當它被讀取時。

相反,你應該做的:

while(myFile >> str)

你還需要再次使用之前(含seekg)來清除流。關於溪流的一個不幸的事情是,他們持有州作爲標誌,如果你不小心,他們可以絆倒你。

myFile.clear();

然後繼續。

4

相反測試eof()(不正常工作),你應該 只是驗證每個輸入已在布爾 方面的工作,通過使用流:

while (myFile >> str) { 
    // ... 
} 

一旦失敗,當然,流處於故障狀態,這 必須重置任何進一步的行動,方可:

myFile.clear(); 
myFile.seekg(0, std::ios_base::beg); 
+0

感謝這一點,非常明確的解釋(它的工作原理)。 seekg中的0是指向文件開始的指針?爲什麼第二個參數不只是ios_base :: beg std :: bit是幹什麼的? – 2012-03-05 15:43:19

+1

@EricBanderhide它確保編譯器可以找到符號。標準庫中的所有符號(宏除外)都在命名空間'std'中。如果你在某處沒有'using namespace std;'或'using std :: ios_base',那麼編譯器就不應該能夠找到'ios_base'。 – 2012-03-05 15:56:22

+0

我明白了!感謝您的額外信息。 – 2012-03-05 20:27:23