我知道这个问题曾经被问过几次,我读了与它相关的线程,但那里的解决方案对我没用。
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没有运行,我不想关闭文件并再次打开,并且文件是大到读入数组真的吗?
TIA,我确信这是一个简单的解决方案,我只是对C ++很新。答案 0 :(得分:4)
您应该,而不是测试eof()
(无法正常工作)
通过使用布尔值中的流来验证每个输入是否有效
上下文:
while ( myFile >> str ) {
// ...
}
当它失败时,当然,流处于失败状态,即 必须在允许进一步操作之前重置:
myFile.clear();
myFile.seekg( 0, std::ios_base::beg );
答案 1 :(得分:1)
myFile >> str
不能保证仅仅因为您检查了文件结尾而起作用,因为这是仅在读取EOF时设置的标志,而不是在将要读取EOF时设置。
相反,你应该这样做:
while( myFile >> str )
您还需要在再次使用之前清除您的信息流(使用seekg)。关于溪流的一个不幸的事情是,他们把州作为旗帜,如果你不小心他们可以绊倒你。
myFile.clear();
然后继续。