如何在c ++中有效地读取最后一行文件

时间:2017-05-31 08:50:29

标签: c++ file

我需要读取在进行一些计算时正在增长的最后一行文件。一开始没有问题,因为文件很小,但是当文件变大时,阅读过程会变慢。

while(!file.eof()){
 if ((std::getline(file,line))){
   std::istringstream iss(line);
   std::istream_iterator<double> it(iss), end;
   std::vector<double> v(it, end);
   std::copy(v.begin(), v.end(), arr);
   v.clear();
   line.clear();
  }
}

什么是更有效的方式来读取文件的最后一行而不读取所有文件直到结束?

2 个答案:

答案 0 :(得分:0)

使用seekg()跳转到文件末尾,然后向后阅读 - 就像这样

if(fs.is_open())
  {
    fs.seekg(-1, std::ios_base::end);
    if(fs.peek() == '\n')
    {
      fs.seekg(-1, std::ios_base::cur);
      int i = fs.tellg();
      for(i;i > 0; i--)
      {
        if(fs.peek() == '\n')
        {
          //Found
          fs.get();
          break;
        }
        fs.seekg(i, std::ios_base::beg);
      }
    }
    std::string lastline;
    getline(fs, lastline);

答案 1 :(得分:0)

使用此算法:

  • 寻找文件的末尾。
  • 反向复制,直到达到换行符(如果文件以其结尾,则跳过换行符)。编辑:这一步实际上有点狡猾的流。内存映射可以使这更容易,但请记住,没有标准的内存映射API。
  • 副本现在是倒退的最后一行。

您可以反向搜索换行符并向前复制,或者只是反转反向行,或者您可以复制到双端队列的前面,以便在复制时反转该行,但也许最快可能是保持颠倒并使用反向迭代器处理它,具体取决于你打算用线做什么。