2013-04-25 68 views
0

我有要求读取文本文件,但它太大,我决定只读取此文件中的一些行。我可以使用查找方法跳转给定线吗?然后,我只能阅读该行,因为该文本文件太大,读整个文件浪费很多时间。如果不可能的话,任何人都可以提供更好的解决方案? (求给定线和读吧)(我知道二进制文本文件阅读逐字节)我想行的一个事件,它的显示号码后,我的文件C++只读取文件中的随机行

event1 0 

subevent 1 

subevent 2 

event2 3 

EX(在我的文件以寻求以前的事件)

+0

你不能寻求一个新的说法,这个概念不存在。您必须找到该行手动结束的位置。你可以实现一个“行”概念的唯一方法是,如果你对每一行都有固定的长度,否则你必须逐行读取并跳过你不想要的行。 – Nim 2013-04-25 11:02:57

+0

...或通过向文件添加行号。 – hansmaad 2013-04-25 11:04:44

+1

多大? – 2013-04-25 11:08:59

回答

0

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

如果你想跳过它,你可以扫描它,保存每一行的偏移量在你选择的容器中,然后用它来寻找特定的行。

1

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

+0

“您可以在文件中找到一个点然后从那里读取”:如果文件是以文本模式打开,则不是。寻找任意点是未定义的行为。 (它通常在Unix下工作,并且会把你放在Windows附近的某个地方,但它可能会做一些完全随机的事情。) – 2013-04-25 11:33:28

+0

@JamesKanze:有趣的一点 - 那么使用二进制模式很好。干杯。 – 2013-04-25 16:13:36

+0

@JamesKanze:不Posix定义文本和二进制模式是相同的?如果真的可以解释它通常在Unix下工作;-)我不记得这个参考,所以它有可能在你看到的数据方面保证是相同的,但是在寻找方面不是这样。 – 2013-04-26 08:22:56

0

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

我最好的建议是分两步来攻击问题:

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

+0

谢谢你的所有答案,其实你的第二个想法目前也在我的脑海里工作,但是如果在创建后,这个文件由引擎创建,我想快速完成这个任务问题是它得到了大量的时间,但我也认为他们没有其他方式要做到这一点:(当考虑到这种情况时间非常重要,因为时间做出一些重要的决定:) – 2013-04-25 12:28:46

0

据我所知,没有内在的方法去寻找新的生产线而不知道生产线在哪里。我无法告诉你最好的方法达到你的目标,因为你的大部分问题的详细信息如何你试图完成它,而不是什么它是你实际上试图完成。因此,我可以有两种选择,与此一:

1)如果你确实需要数据的每一点从文件(没有元数据或其他信息,可以被丢弃):有人提到

扫描文件,随时跟踪线条,并用它建立索引,以便一次读入一行。这可能会奏效,如果你真的需要每一行的全部内容,或者你只需​​要一行一行地阅读小部分的行号和计划,那么这将是一条路。但是,如果不知道有关约束或要求的细节,我不建议使用此方法在整行中读取一个主要原因:我无法知道一行不会太大以至于无法加载(如果只有文件中有一行?)。

相反,我只是简单地分配一个大小适当的缓冲区,一次处理一个合适的数量,然后按照该大小处理文件,直到达到最终。您可以随时传送更多数据。如果没有额外的细节,我不能告诉你这个幻数应该是多少,但是可能需要处理的最大信息量是一个很好的起点。 2)如果你不需要文件中的每一位数据(你可以放弃其中的一些信息),那么你只需要它的一部分。如果你只需要选择一些数据,那么他们更容易找到是否被标记(这是XML的用途)。有很多免费的XML解析器,或者你可以自己写。然后,您将搜索标签而不是任意的行号,对文件所做的更改会导致数据位于不同的位置,这不会影响您在标记时查找它的能力,因为如果您只是要进行标记按行数。