[英]How can I write/create a file larger than 2GB by using C/C++
我嘗試使用 write() function 將一大塊 memory 寫入文件(超過 2GB)但從未成功。 有人可以告訴我該怎么做嗎?
假設 Linux:)
https://users.suse.com/~aj/linux_lfs.html
_FILE_OFFSET_BITS
定義為 64。 ( gcc -D_FILE_OFFSET_BITS=64
)_LARGEFILE_SOURCE
和_LARGEFILE_SOURCE64
。O_LARGEFILE
標志對大文件進行操作還有一些信息: http://www.gnu.org/software/libc/manual/html_node/Opening-Streams.html#index-fopen64-931
如今,您系統上的文件系統將支持開箱即用的大文件。
將-D_FILE_OFFSET_BITS=64
添加到您的編譯器命令行(又名CFLAGS
),它將起作用。 這在任何 64 位系統上都不是必需的,而且現在在某些(但不是全部)32 位系統上也沒有必要。
避免向 go 建議在整個源代碼中寫入O_LARGEFILE
或open64
等。 這是不可移植的,而且很簡單,很丑。
編輯:實際上,我認為我們都誤讀了您的問題。 如果您使用的是 32 位系統,則 memory 中最大可能的單個 object 是 2GB-1byte(即SSIZE_MAX
)。 根據 POSIX,未定義無法放入 ssize_t 的大小為ssize_t
的write
行為; 這是因為write
返回類型ssize_t
並且如果它更大則不能表示寫入的字節數。 或許更重要的是,實現允許對象太大以至於它們的大小不適合ptrdiff_t
是危險的,因為這會造成指針算法可能調用 integer 溢出並因此導致未定義行為的情況。 您可能已經能夠使用mmap
創建如此大的 object(我認為這是您系統的 kernel 或 libc 中的錯誤),但這是一個非常糟糕的主意,並且會導致各種錯誤。 如果您需要大於 2GB 的單個對象,您確實需要在 64 位機器上運行以確保安全且無錯誤。
它取決於操作系統、處理器和文件系統。 在 Linux/x86-64 系統(帶有 ext3 文件系統)上,這很容易做到。 只需使用常用的庫函數(在 C++ std::ofstream
中,在 C <stdio.h>
中, fopen
&& fprintf
等)或底層系統調用(打開、寫入)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.