【问题标题】:How to get a specific line on a text file directly in C? (without iterating line-by-line)如何直接在C中获取文本文件中的特定行? (无需逐行迭代)
【发布时间】:2021-05-14 01:29:38
【问题描述】:

有没有一种方法可以在文本文件中获取特定行,而无需在 C 中逐行迭代?

例如,我有这个文本文件names.txt,它包含以下名称;

John
James
Julia
Jasmine

我想立即访问 'Julia' 而不遍历 'John' 和 'James'?,例如,只需给出索引值 '2' 或 '3' 即可立即访问 'Julia'。

有没有办法在 C 中做到这一点?

我只是想知道如何处理,因为我想处理一个非常大的文本文件,比如大约 30 亿行,我想立即访问其中的特定行,并且逐行迭代非常慢

【问题讨论】:

  • 你需要在你的文本文件上建立一个索引:第二个文件,它为每一行存储它开始的偏移量,作为一个固定大小的整数。在这一点上,您可能更愿意使用数据库(查看 SQLite 以了解易于集成的内容)。
  • 将索引构建为@YakovGalka 允许您读取文件一次以构建索引。之后,使用fseek 进入任何线路都很快。或者,您可以将所有行(例如使用 nuls)填充到最大行长度。然后你可以通过乘法找到任何行的字节偏移量。当然,这样浪费了填充所需的磁盘空间。但是您不需要额外读取索引来获取每一行。

标签: c indexing text bigdata


【解决方案1】:

您必须至少遍历所有行一次。在此迭代中,在读取一行之前,您记录文件中的位置并将其保存到数组或另一个文件(通常称为索引文件)。该文件应具有固定的记录大小,以便于将位置存储在文本文件中。

稍后,当您要访问给定行时,您可以使用数组来获取位置(行号是数组索引)或文件(您在文件中查找以偏移记录大小的行号)并读取位置。获得位置后,您可以查看文本文件到该位置并读取该行。

每次更新文本文件时,都必须重建数组或索引文件。

还有其他方法可以做到这一点,但您需要更好地解释上下文。

【讨论】:

  • 请在我的回答符合您的需要时将其标记为已接受。使用答案左侧的复选标记。
猜你喜欢
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 2010-12-06
相关资源
最近更新 更多