我正在编写一个程序,我记录所有写入文件,在进程终止之前,我写了所有写入,即从日志到实际文件 . 现在,在日志中每个类型的记录如下:
offset, length, data
在写入之后我需要计算偏移量,这样当我最终写入实际文件时,我可以找到该位置,以便写入下一个写入或读取 .
写入的当前偏移位置字节是否会在写入后给出文件偏移量 .
谢谢
使用fgetpos获取文件偏移量,使用fsetpos设置文件偏移量 .
有几种方法可以实现这一目标:
First Way (在这种情况下,位置将自动更新为您已阅读的数量 . )
将所有日志内容读入内存
按(偏移长度)增长排序
使用连续的读取调用
Second Way (最便携)
使用 fgetpos(), fgetpos64() 和 fsetpos(),fsetpos64() 功能集 .
Third Way
使用 ftello(), fseeko() 和 ftello64(), fseeko64() 功能集 .
Fourth Way (不太便携)
使用 ftell(), fseek() 和 ftell64(), fseek64() 功能集 .
func() 和 func64() 之间的区别在于func64()使用正确的64位偏移量,这消除了超过4Gb的文件的问题,而func()使用的int类型可能是32位或64位,具体取决于体系结构 .
fseeko() 和 ftello() 函数与 fseek() 和 ftell() 相同,只是fseeko()的偏移量参数和ftello()的返回值的类型为off_t而不是long .
最后,最佳做法是使用fgetpos64()/ fsetpos64()或ftello64()/ fseeko64() . 尽量避免使用ftell()和fseek() .
2 回答
使用fgetpos获取文件偏移量,使用fsetpos设置文件偏移量 .
有几种方法可以实现这一目标:
First Way (在这种情况下,位置将自动更新为您已阅读的数量 . )
将所有日志内容读入内存
按(偏移长度)增长排序
使用连续的读取调用
Second Way (最便携)
使用 fgetpos(), fgetpos64() 和 fsetpos(),fsetpos64() 功能集 .
Third Way
使用 ftello(), fseeko() 和 ftello64(), fseeko64() 功能集 .
Fourth Way (不太便携)
使用 ftell(), fseek() 和 ftell64(), fseek64() 功能集 .
func() 和 func64() 之间的区别在于func64()使用正确的64位偏移量,这消除了超过4Gb的文件的问题,而func()使用的int类型可能是32位或64位,具体取决于体系结构 .
fseeko() 和 ftello() 函数与 fseek() 和 ftell() 相同,只是fseeko()的偏移量参数和ftello()的返回值的类型为off_t而不是long .
最后,最佳做法是使用fgetpos64()/ fsetpos64()或ftello64()/ fseeko64() . 尽量避免使用ftell()和fseek() .