Fseek到一个行号(可变长度的行)

时间:2014-08-30 07:27:30

标签: c fseek

我有一个带有可变长度行的大文件(~10GB),我想以编程方式转到不同的行号。有没有一种有效的方法呢?

3 个答案:

答案 0 :(得分:4)

是:建立索引。例如,只需在包含各种行号的字节偏移量的一侧创建文本文件,就像这样:

line,offset
0,0
10000,48272
20000,93726

等。然后,当你想转到13043行时,只需跳转到偏移48272并跳过另外3043个换行符。简单而有效。

另一种方法是使线长不变。如果它们已经具有相似的长度,那么这将很有效,因此您不会浪费太多空间。您可以使用\0字符或空格或其他内容填充它们,然后将文件索引为大矩阵(行N为N * LEN字节)。

最后,您可以简单地在行本身的开头写下行号。然后只需在文件中进行二进制搜索,跳到换行符,然后检查下一个行号,以了解是向后还是向前看(甚至猜测多少)。

答案 1 :(得分:2)

没有有效的方法可以做到这一点。您需要扫描整个文件一次以记住行标记结束的时间。

实际上,你需要一个大循环,例如getline(3)

你可以记住,例如每100行的偏移量,可能是使用GDBM或某些Sqlite数据库的大数组或某个索引文件。

我的感觉是你根本不应该有这么大的文本文件(随机访问一个巨大的文本文件是错误的症状)。如果您需要随机访问,这不是存储此类数据的有效方法。例如,您可以简化它以填充某些数据库等...可能您不应该将大量数据放在文本文件中,而是直接放在数据库或其他任何数据中。

答案 2 :(得分:1)

不直接使用fseek,因为它只能按字节数移动位置。

如果效率要求来自于你必须多次来回做这个事实,一个简单的解决方案可能是扫描整个文件一次并计算所有行长度,将它们存储在地图或数组中然后使用值可以准确地移动到您想要的位置。