在C ++中回放ifStream

时间:2012-03-05 15:31:13

标签: 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没有运行,我不想关闭文件并再次打开,并且文件是大到读入数组真的吗?

TIA,我确信这是一个简单的解决方案,我只是对C ++很新。

2 个答案:

答案 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();

然后继续。