c - Fseek 到行号(具有可变长度的行)

标签 c fseek

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

最佳答案

是的:建立索引。例如,您可以在一侧创建一个文本文件,其中包含各种行号的字节偏移量,如下所示:

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

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

另一种方法是使您的行长度保持不变。如果它们已经具有相似的长度,那么这会很有效,这样您就不会浪费太多空间。您可以用 \0 字符或空格或其他任何内容填充它们,然后像​​一个大矩阵一样对文件进行索引(第 N 行在 N*LEN 字节处)。

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

关于c - Fseek 到行号(具有可变长度的行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25580069/

相关文章:

c - 如何在 C 中调用以函数指针作为参数的函数?

c - 如何绕过 Linux VFS inode 缓存?不将 inode 添加到其 super_block 列表是否安全?

c++ - 为什么这两个函数指针在 C/C++ 中都是合法的?

c - 文件大小总是在变化,使用 C 和 fopen_s 函数

c++ - 具有 `stdio.h` 函数的模板和名称查找

c++ - 没有分号的程序在 C 中编译得很好,而不是在 C++ 中为什么?

c - VC++中同一项目的两个c文件之间传递值

c - C 编程中的 fseek 和 fgets 在这里没有正确使用?

c - 二进制文件读取

c - 撤消 ungetc() : "How" do fseek(), rewind() 和 fsetpos() 的效果吗?是否每次都重新填充缓冲区?