C ++只读文件中的随机行

时间:2013-04-25 10:59:38

标签: c++ c++11 c++builder

我要求阅读文本文件但是它太大了我决定只阅读这个文件中的一些行。跳转给定线可以使用搜索方法吗?然后我只能读取该行,因为该文本文件太大,读取整个文件浪费了大量时间。如果不可能,任何人都可以提供更好的解决方案吗? (寻找给定行并阅读它)(我知道二进制文本文件是逐字节读取的)

ex of my file

event1 0

subevent 1

subevent 2

event2  3 

(在我的文件中,在一个事件之后显示我想要为之前事件寻找的行数)

4 个答案:

答案 0 :(得分:1)

是的,您可以在文件中找到一个点然后从那里读取。一个可能的问题是,如果线条都是不同的长度,文件中的随机位置将更有可能处于更长的线条中:您不会获得不同线条的均匀分布概率。如果你真的必须具有相同的概率,那么你需要至少对文件进行一次传递以找到每一行的开始 - 然后你可以将这些偏移存储在一个向量中并随机选择一个向量元素来指导寻找行数据在文件中。如果你只关心一点,那么你可以推进一个小的但是随机数量的线超过你最初寻求的那个......这甚至可能有点几率,避免了初始传球,但并不完美。 hansmaad的评论也添加了一个简洁的方法 - 完美的结果和非常好的性能 - 但要求你在文件本身中编号的所有行。

答案 1 :(得分:0)

除非每条线的长度完全相同,否则您将不得不扫描它。

如果您想在其中跳转,可以浏览它,保存每个行在您选择的容器中的偏移量,然后使用它来寻找特定的行。

答案 2 :(得分:0)

假设这些行是可变/随机长度,我不相信有任何内置方法可以直接跳转到特定行的开头。您可以在文件中寻找任意字节位置。但是,这可能会落在一行的开头/中间/末尾的任何地方。

我最好的建议是分两步来解决问题:

首先,逐字节地完整传递文件,搜索每一行的开头。记录每一行的字节位置并将其存储到数组,向量等中。(基本上,您正在创建一个从行号映射到起始位置的索引。)然后,当您建立此索引时,您可以轻松跳转通过查找索引中的位置来查看特定行。

答案 3 :(得分:0)

据我所知,没有内置的方法可以在不知道线路的位置的情况下寻找新的线路。我无法告诉您最佳方式来实现您的目标,因为您的大多数问题详细信息 您正在尝试实现它,而不是什么

1)如果您确实需要文件中的每一个最后一位数据(没有可以丢弃的元数据或其他信息):

有人提到扫描文件,跟踪线条并使用它构建索引,这样您就可以一次读取一行。这可能有用,如果您确实需要完整的每一条线,或者如果您只需要线号并计划从那里一次读取小块,那么这将是可行的方法。但是,在不知道有关约束或要求的详细信息的情况下,我不建议使用此方法读取整行,主要原因之一是:我无法知道一行本身不会太大而无法加载(如果只有文件中的一行?)。

相反,我只需要分配一个大小适当的缓冲区来一次处理,然后以该大小的块处理文件,直到结束。您可以随时流式传输更多数据。如果没有其他细节,我无法告诉你这个神奇数字应该是什么,但是你可能需要处理的最大信息块的大小是一个很好的起点。

2)如果你不需要文件中的每一个数据(你可以丢弃其中的一些信息),那么你只需要一些数据。如果您只需要选择数据,那么如果标记它们就更容易找到(这就是XML的用途)。有很多免费的XML解析器,或者你可以自己编写。然后你会搜索标签而不是任意行号,并且对文件的更改会导致数据位于不同的位置,这不会影响你在标记时找到它的能力,就像你刚刚去的那样按行号。