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

2022-02-18 09:34:52 字數 1451 閱讀 3652

在專案中做大檔案的增量讀寫,遇到了問題:

fopen : value too large for defined data type.
習慣性地根據這個提示查閱的有關資料顯示:

1)工具鏈太老了:海思的工具鏈我目前找不到更換的方法,也為了穩定性,不再增加新的ulibc庫

2)檔案系統的 inde是 64位的:檢視了cat /proc/fs///options,發現一切正常

顯然,這樣的結果並不能讓我滿足。

由於上文的方向不對,於是我換了個思路,直接根據需求查詢: "linux c 讀寫大檔案"

了解到了有關資訊:

#define _largefile_source

#define _largefile64_source

#define _file_offset_bits 64

細心的讀者肯定注意到了,還有2個巨集,這2個巨集是與 fpos_t 有關的;而這個 fpos_t 與 操作檔案偏移量有關。

傳統 偏移操作 :fseek()+ftell()

fseek(fp,0,seek_end);

length = ftell(fp);

fseek( fp, 0, seek_set);

printf("%ld", length );

處理大檔案時,ftell 的返回值有問題:要麼是-1,要麼是_length資料型別的最大值,總之都是不對的。

而正確的方式應該是 使用 :fseek()+fgetpos()fsetpos()

解決辦法是:

fpos_t pos;

fseek(fp,0,seek_end);

fgetpos(fp,&pos);

fseek( fp, 0, seek_set);

我們都知道ftell與fseek一起使用;而fsetpos與fgetpos也要結合fseek使用。

ftell與fseek返回的是長整數,而後面兩個則是返回乙個新型別:fpos_t

ftell() 用長整型表示檔案內的偏移 (位置), 因此, 偏移量被 限制在 20 億 (231-1) 以內。

而新的 fgetpos() 和 fsetpos() 函式使用 了乙個特殊的型別定義 fpos_t 來表示偏移量 (這個型別的值的內容與 _largefile_source、_largefile64_source 巨集有關)

因此, fgetpos() 和 fsetpos 可以表示任意大小的檔案偏移,fgetpos() 和 gsetpos() 也可以用來記錄多位元組流式檔案的狀態。

我在查閱資料的時候,也發現 可以通過 mmap 的方式來操作大檔案(以前讀寫framebuffer的時候就用到了這種方式)

ORACLE 使用超過2G記憶體

在http blog.chinaunix.net u1 50863 showart 411877.html海鷗大哥的部落格上看見這個帖子,覺得很有用。保留下來日後仔細研究。他人的成果不敢據為己有,特此宣告下。伺服器 hpdl 580g 2 雙cpu 6g記憶體 win2003 enterprise ...

linux解壓超過2G大檔案

最近資料伺服器出現問題 通過exp命令備份 資料達到14g 壓縮命令 zip r 20130314.zip 20130314.dmp ls l 檢視檔案大小 壓縮zip格式也有3.2g rw r r 1 root root 3826207807 03 28 22 14 20130314.zip 新準...

linux下編譯程式使其處理超過2G的大檔案

為使程式可以處理大檔案的能力,在檔案中可以新增 define d largefile source define d largefile64 source define d file offset bits 64 在gcc編譯時,加入的大檔案 大於2g 支援引數 gcc d file offset ...