我需要使用C访问大于2gb的文件。在程序的一次运行期间,将从文件中读取可变数量的字节并保存下一个位置的位置。在下一次运行程序期间,将读取文件位置,并从该位置开始读取多个字节。
复杂的是偶尔可以通过将文件复制到新文件来“压缩”文件,减少已经读取的任何字节(我认为复制是唯一的方法)。以这种方式删除的字节数也将被保存。
我需要知道文件从原始开始的当前位置,以便与另一个文件同步。这应该很简单,因为它只是(current_offset + deleted_bytes)。
不容易的原因是fseek只使用long int索引将文件限制为2gb,而fsetpos使用fpos_t结构作为位置索引,这不是数字,不能来回转换一。我不知道如何使用long long int索引进行文件定位,这将是理想的解决方案。
我该怎么办?
答案 0 :(得分:6)
在Windows上,您可以使用_lseeki64()
进行64位搜索。
为了与linux兼容,您还可以在编译时添加-D_FILE_OFFSET_BITS=64
,然后在其中一个标题中执行此操作:
#ifdef __MINGW32__ // or whatever you use to find out you're compiling on windows
#define lseek _lseeki64
#endif
然后像往常一样使用lseek()
。这是有效的,因为Windows会忽略_FILE_OFFSET_BITS
标志,并且linux不会看到lseek
的重新定义。
如果您更喜欢FILE*
版本,还有_fseeki64()
,并且还有等效的64位tell()
和ftell()
函数(_telli64()
和{{1} }})。
答案 1 :(得分:1)
添加编译标记-D_FILE_OFFSET_BITS=64
,使fopen
,fseek
,off_t
等变为64位,可用于处理大小超过2 GB的文件。有关详细信息,请参阅Large File Support in Linux。