【问题标题】:Reading a text file from the first line multiple times (C++)多次从第一行读取文本文件(C++)
【发布时间】:2014-12-10 09:36:58
【问题描述】:

我正在使用“getline”来读取文本文件中的一些行。它可以正常工作,但我多次调用该方法。

while(getline(file, line))
{
    //Do something
}

//More code in between

while(getline(file, line))
{
    //Do something else
}

问题是,当我第二次调用“getline”时,它从之前完成的位置开始读取(例如,如果第一个 while 循环在第二行结束,那么下一个循环从第三行开始)。如何确保我的程序每次都从第一行读取文件?

【问题讨论】:

  • 你为什么这样做?读完后为什么不保留这条线?无论如何,答案在 Yann4 链接的线程中。
  • 这会让你回到开头:file.clear(); file.seekg(0);

标签: c++ file iostream getline


【解决方案1】:

如果您多次需要相同的第一行,我认为您应该重新考虑您的策略。

  1. 只需阅读该行一次。
  2. 将其保存在一个变量中(或将其保存在您已有的变量“行”中)。
  3. 关闭文件。

您将避免很多不必要的 I/O 操作...

不过,正如其他人所建议的,如果您出于任何原因想要继续使用这种方法,您需要插入:

myinputstream.clear();             //clear the buffer
myinputstream.seekg(0, ios::beg);  //reset the reading position to beginning

在每次尝试读取同一文件之间。 并且不要忘记最终关闭它。

myinputstream.close();

【讨论】:

  • 如果他的文件很大,在不同的时间出于不同的原因需要查找不同的行怎么办?
  • 问题被明确提出,所以应该是评论,而不是答案。
  • @Xarylem:在网站上使用的markdown中,当你想要有序列表时,在每个数字后面写点(.)而不是-
【解决方案2】:

有一个 seekg() 函数应该会有所帮助 http://www.cplusplus.com/reference/istream/istream/seekg/

 iostream::seekg (0, iostream::beg);

将在流的开头移动您

【讨论】:

  • 我认为在某些情况下您可能还需要先清除流的错误标志。
  • 当然,用户应该记住错误标志不会自行重置。
  • 有时我们打开一个文件进行读取,而另一个进程打开它进行写入......这就是我们通过多次打开它来更新的原因。是的,每次读取后我们都会移动到文件的开头,因为读取结束意味着到达 EOF。所以: myinputstream.clear(); //清除缓冲区 myinputstream.seekg(0, ios::beg); //重置阅读位置到开始
猜你喜欢
  • 2021-05-08
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多