在專案中做大檔案的增量讀寫,遇到了問題:
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 ...