【问题标题】:C++ skip multiple lines efficientlyC++ 有效地跳过多行
【发布时间】:2014-09-27 00:02:23
【问题描述】:

我有代码每四行读取一次并用它做一些事情

ifstream in(inputFile, ios::in);
string zeile;
for (int z = 0; z < numberOfSequences; z++) {
    getline(in,zeile); // skip 3 lines
    getline(in,zeile); // skip 3 lines
    getline(in,zeile); // skip 3 lines
    getline(in,zeile);
    // do something with zeile
}

我的问题是,ASCII 文件有超过 250 000 000 行。所以我对跳过 3 行的最有效方法感兴趣。 getline 是否将某种类型的 in 解析为字符串,或者这是最有效的方法?我不想浪费时间跳过。

【问题讨论】:

  • 我认为使用 4096 字节块的乘法读取二进制文件并寻找换行符是最有效的;不确定,需要测试一下。
  • 您可能会发现 C IO 函数在解析如此大量的数据时速度更快。悲伤,但真实。
  • 我希望有效的方式涉及异步 I/O。看看Boost.Asio library
  • 除了使您的代码复杂化之外,我看不出使这种异步方式能够完成什么。异步 I/O 并不是一种能神奇地让一切变得更快的钝器。

标签: c++ file-io getline


【解决方案1】:

这是几乎最有效的方法;发生的唯一“解析”是搜索您确实需要的行尾。

您唯一可以改进的就是不必存储比实际处理量多四倍的行数。你可以用std::basic_istream::ignore做到这一点:

std::ifstream in(inputFile, std::ios::in);
for (int z = 0; in && z < numberOfSequences; z++) {

   // Skip three lines
   for (int i = 0; i < 3; i++)
      in.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

   // Read the fourth line...
   std::string zeile;
   if (std::getline(in, zeile))
      foo(zeile);
}

【讨论】:

    猜你喜欢
    • 2015-06-15
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 2015-03-11
    • 1970-01-01
    相关资源
    最近更新 更多