簡體   English   中英

如何使用 C/C++ 編寫/創建大於 2GB 的文件

[英]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
  • 使用帶有 open 的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_LARGEFILEopen64等。 這是不可移植的,而且很簡單,很丑。

編輯:實際上,我認為我們都誤讀了您的問題。 如果您使用的是 32 位系統,則 memory 中最大可能的單個 object 是 2GB-1byte(即SSIZE_MAX )。 根據 POSIX,未定義無法放入 ssize_t 的大小為ssize_twrite行為; 這是因為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM