winapi - 快速访问大文件 - fseek ftell fsetpos fgetpos

标签 winapi fseek ftell

我面临着提供对千兆字节文件中选定数据的某种快速访问的问题。一旦找到起始点,后续的访问就会是顺序的。这些文件在每条记录的前面都包含一个日期,并且日期在整个文件中逐渐增加。我不想从头开始并通读文件而忽略前面的内容。我只对 WINDOWS 应用程序感兴趣。我想以文本模式打开该文件。

我想到我可以使用 64 位 fseek/ftell 或 fsetpos/fgetpos 函数进行某种二分搜索。我意识到我可能会寻找换行符分隔记录的中间,但人们会认为您可以通过 fgets 调用简单地跳过任何部分记录。

fseek 提供了原始 SEEK_END 机制,因此似乎可以与 ftell 一起使用来确定文件大小。我没有看到与 fsetpos/fgetpos 类似的功能。如果使用 fsetpos/fgetpos,如何获取文件大小?

_fseeki64/_ftelli64 使用 int64,fsetpos/fgetpos 使用的 fpos_t 也是 int64,所以我应该能够对指针进行算术运算。

还是我走错了路?我应该考虑其他方法吗?

最佳答案

_fseeki64/_ftelli64 完全按照您的意愿行事,那么您为什么犹豫使用它们呢?你的方法很好。

关于winapi - 快速访问大文件 - fseek ftell fsetpos fgetpos,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9633691/

相关文章:

python - 在 Windows 上列出串行 (COM) 端口?

C++初学者如何使用GetSystemTimeAsFileTime

c - 使用 fseek 回溯

c - malloc() 没有分配足够的空间

c++ - 将文件读入字符串缓冲区并检测 EOF

c - 在 C 中覆盖文件中的行,奇怪的输出

c++ - 强制完整性级别值 0x2010 代表什么?

c - fseek(stdin,0,SEEK_SET) 和 rewind(stdin) 确实会刷新输入缓冲区 "stdin"。可以使用它们吗?

c - 从文件中删除空字符

delphi - 使用Windows API绘制Button时,我们需要负责绘制标题吗?