用C讀寫超2G檔案

2021-10-11 14:28:40 字數 991 閱讀 4690

摘自

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

用fopen開啟2G以上大檔案

fopen開啟2g以上的檔案,是無法開啟的,我估計是跟32bit有關係,跟記憶體大小有關係。網上說的一些方法 1 用fopen64 2 undef file offset bits define file offset bits 64 include include 3 在makefile編譯選項裡...

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

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

Linux C 讀寫超過2G的大檔案 注意事項

在專案中做大檔案的增量讀寫,遇到了問題 fopen value too large for defined data type.習慣性地根據這個提示查閱的有關資料顯示 1 工具鏈太老了 海思的工具鏈我目前找不到更換的方法,也為了穩定性,不再增加新的ulibc庫 2 檔案系統的 inde是 64位的 ...