【问题标题】:C++: Get line by the line number [duplicate]C ++:通过行号获取行[重复]
【发布时间】:2014-06-17 08:47:19
【问题描述】:

有没有一种快速的方法可以通过行号从文本文件中获取一行?如果我只想要第 20 行,是否有任何东西可以让我执行获取第 20 行之类的操作?我知道 getline(in, line) 一次读取每一行,但我宁愿不调用 getline 20 次来获得第 20 行。

谢谢!

【问题讨论】:

  • 这是 C++ 还是 C# 问题?您将此标记为C#,并在标题中将其指定为C++
  • 副本中的答案也适用于 C++...
  • 对不起,我是想标记C++,我只是习惯用C#编码,所以我不小心标记了它。
  • 无论哪种方式,答案都相同,您可以将其设置为一个字节,但不能设置为一行。

标签: c++ getline


【解决方案1】:

不,没有快速而神奇的方法。

背景
文本文件记录是可变长度的。每个文本行的字符数可能不同。固定记录很容易,因为它们的长度是已知的。

要找到第 Nth 条记录,您必须找到文本记录的开头或结尾。这通常通过搜索换行符来执行。还是很乏味。

转换为随机访问
如果多次请求数据,记录行号及其位置的映射或字典会很方便。使用行号,检索文件位置,然后将文件指针设置到给定位置。

内存映射文件
如果有足够的内存,则可以读取文件并将其存储在内存中。

但是,仍然需要搜索换行符并计算它们以找到第 X 行。

总结
没有快速的方法可以第一次找到文件中文本行的开头。在任何情况下,都必须在文本中搜索换行符并计算换行符。

有一些方法可以加快进程,但这些方法涉及读取文件一次或多次。行号到文件位置的映射很快,但需要初始扫描。将文件加载到内存(内存映射)需要将文件读入内存(先读取)然后搜索内存;此外,操作系统可能只加载请求的部分文件,而不是整个文件。

【讨论】:

    【解决方案2】:

    不,您必须使用循环二十次才能进入下一行。

    无法执行您想要的操作的原因是文件的结构方式:它是一个字节序列,而新行只是另一个字节(或两个字节的序列,按照 Windows 约定)。

    【讨论】:

      猜你喜欢
      • 2018-01-07
      • 2019-12-30
      • 1970-01-01
      • 1970-01-01
      • 2022-11-29
      • 1970-01-01
      • 2023-03-18
      • 2012-09-11
      • 1970-01-01
      相关资源
      最近更新 更多