9

在我使用 ifstream 从文件中读取一行后,有没有办法有条件地将流带回到我刚刚读取的行的开头?

using namespace std;
//Some code here
ifstream ifs(filename);
string line;
while(ifs >> line)
{
   //Some code here related to the line I just read

   if(someCondition == true)
   {
    //Go back to the beginning of the line just read
   }
   //More code here
} 

因此,如果 someCondition 为真,则在下一次 while 循环迭代期间读取的下一行将是我刚刚读取的同一行。否则,下一次 while 循环迭代将使用文件中的以下行。如果您需要进一步说明,请随时询问。提前致谢!

更新#1

所以我尝试了以下方法:

while(ifs >> line)
{
   //Some code here related to the line I just read
   int place = ifs.tellg();
   if(someCondition == true)
   {
    //Go back to the beginning of the line just read
    ifs.seekg(place);
   }
   //More code here
}

但是当条件为真时,它不会再次读取同一行。整数在这里是可接受的类型吗?

更新#2:解决方案

我的逻辑有错误。对于任何好奇的人来说,这是我想要的更正版本:

int place = 0;
while(ifs >> line)
{
   //Some code here related to the line I just read

   if(someCondition == true)
   {
    //Go back to the beginning of the line just read
    ifs.seekg(place);
   }
  place = ifs.tellg();
   //More code here
}

对tellg() 的调用被移到了末尾,因为您需要寻找到先前读取的行的开头。第一次我调用了tellg(),然后在流甚至改变之前调用了seekg(),这就是为什么它似乎没有改变(因为它真的没有改变)。谢谢大家的贡献。

4

2 回答 2

6

没有直接的方法可以说“回到最后一行的开头”。但是,您可以使用 回到您保留的位置std::istream::tellg()。也就是说,在阅读您要使用的行之前tellg(),然后seekg()回到该位置。

However, calling the seek functions frequently is fairly expensive, i.e., I would look at removing the requirement to read lines again.

于 2012-10-15T21:17:56.863 回答
4

将 fstream 位置存储在文件中(查看文档)。

读线。

如果发生这种情况 - 转到文件中的存储位置。

你需要这个:

于 2012-10-15T21:16:28.433 回答