2012-03-05 59 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