2

write() 関数を使用して大量のメモリ (2GB 以上) をファイルに書き込もうとしましたが、成功しませんでした。誰か優しくして、私に何をすべきか教えてくれませんか?

4

3 に答える 3

4

Linuxを想定しています:)

https://users.suse.com/~aj/linux_lfs.html

  • _FILE_OFFSET_BITS64 に定義します。 ( gcc -D_FILE_OFFSET_BITS=64)
  • とを定義_LARGEFILE_SOURCE_LARGEFILE_SOURCE64ます。
  • O_LARGEFILE大きなファイルを操作するには、open でフラグを使用します

そこにもいくつかの情報があります: http://www.gnu.org/software/libc/manual/html_node/Opening-Streams.html#index-fopen64-931

最近では、システムにあるファイル システムはすぐに大きなファイルをサポートします。

于 2012-04-06T10:30:30.713 に答える
3

-D_FILE_OFFSET_BITS=64コンパイラ コマンド ライン (aka )に追加すると、機能しますCFLAGS。これは、64 ビット システムでは必要ありません。また、最近では一部の (すべてではない) 32 ビット システムでも不要です。

ソース全体に書き込みなどO_LARGEFILEを行うようにというアドバイスは避けてください。open64これは移植性がなく、単純に醜いです。

編集:実際、私たちは皆、あなたの問題を誤解していると思います. 32 ビット システムを使用している場合、メモリ内で可能な最大の単一オブジェクトは 2GB-1 バイト (つまりSSIZE_MAX) です。POSIX では、write収まらないサイズ引数の動作ssize_tは定義されていません。これは、write型が返さssize_tれ、書き込まれたバイト数が大きい場合は、その数を表すことができないためです。おそらくもっと重要なことは、オブジェクトのサイズが に収まらないほど大きいオブジェクトを実装で許可することは危険です。これはptrdiff_t、ポインター演算が整数オーバーフローを引き起こし、未定義の動作を引き起こす可能性があるためです。このような大きなオブジェクトを作成できたかもしれませんmmap(私はこれをシステムのカーネルまたは libc のバグと考えます)、しかしそれは非常に悪い考えであり、あらゆる種類のバグにつながります。2GB を超える単一オブジェクトが必要な場合は、安全でバグのない 64 ビット マシンで実行する必要があります。

于 2012-04-06T13:04:04.403 に答える
2

オペレーティング システム、プロセッサ、ファイル システムによって異なります。Linux/x86-64 システム (ext3 ファイル システムを使用) では、簡単に実行できます。通常のライブラリ関数 ( C++ std::ofstream、 C <stdio.h>fopen&&fprintfなど) または基礎となるシステム コール (open、write) を使用するだけです。

于 2012-04-06T10:27:32.183 に答える