【问题标题】:Reading line X until line Y from file in C++从 C++ 文件中读取 X 行直到 Y 行
【发布时间】:2009-05-12 06:20:52
【问题描述】:

我有一个相对简单的问题。假设我有一个文件,但我只想访问文件的第 X 行直到第 Y 行,这样做最简单的方法是什么?

我知道我可以逐行阅读并保持计数,直到达到我真正需要的行,但是有更好更优雅的解决方案吗?

谢谢。

【问题讨论】:

    标签: c++ file input


    【解决方案1】:

    在 C++ 中,不,不是真的(嗯,不是在我熟悉的任何语言中,真的)。

    你必须从文件的开头开始,这样你才能确定第 X 行的开始位置(除非它是一个固定记录长度的文件,但对于文本来说不太可能)。

    同样,您必须这样做,直到找到您感兴趣的最后一行。

    如果您害怕缓冲区溢出漏洞,您可以读取字符而不是行,或者您可以读取固定大小的块并计算换行符以提高速度,但这一切都归结为读取和检查每个字符(通过您的代码显式或隐式语言库)来计算换行符。

    【讨论】:

      【解决方案2】:

      您可以使用 istream::ignore() 来避免缓冲不需要的输入。

      bool skip_lines(std::istream &is, std::streamsize n)
      {
        while(is.good() && n--) {
           is.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        }
      
        return is.good();
      }
      

      【讨论】:

      • 很好的解决方案,但我可能会返回对流的引用,而不仅仅是它的状态。那会更灵活一些。
      【解决方案3】:

      搜索 \n X 次,开始“阅读”(无论需要什么处理),直到到达 Y-X \n 或 EOF。假设 unix 风格的新行。

      【讨论】:

        【解决方案4】:

        由于您必须确保每行内的结束行字符才能计算行数,因此您仍然需要遍历文件。我能想到的唯一优化不是逐行读取文件,而是缓冲它,然后迭代计算行数。

        【讨论】:

          【解决方案5】:

          使用 C 或 C++,有一些函数可用于跳过文件中指定数量的字节(在 stdio 中使用 fseek,在 istreams 和 ostreams 中使用 seekp)。但是,您不能指定给定的行数,因为每行可能有可变数量的字符,因此无法计算正确的偏移量。文件不是每行占据一个“行”的某种数组:您宁愿将其视为连续的内存空间(这里不是在谈论硬件......)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-09-11
            • 1970-01-01
            • 2017-12-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多