C語言操作大於2G的檔案

2021-07-04 19:57:32 字數 963 閱讀 4693

tips:

1.當檔案小於2g時,使用fseek和ftell可以獲取檔案的大小,必須是這兩者搭配。

2.當檔案大於4g時,使用_fseeki64和_ftelli64,如果不確定自己操作的檔案大小建議使用_fseeki64和_ftelli64

3.這個兩個函式的引數是一致的,通用。

解釋一下為什麼fseek無法定位大於2g的檔案。看一下fseek的定義:

_check_return_opt_ _crtimp int __cdecl fseek(_inout_ file * _file, _in_ long _offset, _in_ int _origin);

第二個引數offset表示相對於標記origin的偏移量,定義是long型別,在32位平台下,他表示的檔案大小是2^31=2g。因此對於大於2g的檔案他就無能為力啦。再看看_fseeki64的定義:

_check_return_opt_ _crtimp int __cdecl _fseeki64(_inout_ file * _file, _in_ __int64 _offset, _in_ int _origin);
offset偏移量的定義為int64,所以這個函式可以定位的檔案大小為2^63 = 8589934592g

。tips:

1.fseek,_fseeki64是帶緩衝的,如果不進行檔案讀寫時,檔案指標是空的,不會移動的,除錯的時候不能通過判斷檔案指標的值來判斷定位是否成功,而是判斷函式的返回值。

2.fread和fwrite不受檔案大小的限制

3.如果遇到使用_fseeki64不成功的話,嘗試在加上以下巨集定義:

#define __use_file_offset64

#define _largefile64_source

#define _file_offset_bits 64

linux下操作大於2G檔案

1 包含所有標頭檔案以前,先定義這些巨集 ifndef use file offset64 define use file offset64 endif ifndef use largefile64 define use largefile64 endif ifndef largefile64 so...

關於fseek不能定位大於2G檔案的問題

最近在進行檔案斷點續傳的時候用到了fseek來定位檔案位置,一開始用小檔案測試沒有發現什麼問題,但是用大於2g的檔案測試的時候fseek列印出錯,查相關資料,發現fseek的第二個引數型別是long,也就是說只能定位2g以內的檔案,另外有兩個類似的函式fseeko和fseeko64,fseeko類似...

用C讀寫超2G檔案

摘自 tips 1.當檔案小於2g時,使用fseek和ftell可以獲取檔案的大小,必須是這兩者搭配。2.當檔案大於4g時,使用 fseeki64和 ftelli64,如果不確定自己操作的檔案大小建議使用 fseeki64和 ftelli64 3.這個兩個函式的引數是一致的,通用。解釋一下為什麼fs...