【问题标题】:How to efficiently read the last line of file in c++ [duplicate]如何在c ++中有效地读取文件的最后一行[重复]
【发布时间】:2017-05-31 08:50:29
【问题描述】:

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

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();
  }
}

什么是读取文件最后一行而不读取所有文件直到到达末尾的更有效方法?

【问题讨论】:

标签: c++ file


【解决方案1】:

使用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);

【讨论】:

    【解决方案2】:

    使用这个算法:

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

    您可以只是反向搜索换行符并正向复制,或者只是反转反转行,或者您可以复制到双端队列的前面,以便在复制时反转行,但也许最快的可能是保持反转并使用反向迭代器对其进行处理,具体取决于您打算对该行执行的操作。

    【讨论】:

      猜你喜欢
      • 2012-05-11
      • 2023-03-09
      • 2011-11-02
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多