Windows で大きなファイルを作成するのに問題はないはずですが、ファイルに対して 32 ビット バージョンのシークを使用すると、ファイルが 32 ビット ファイルであると判断され、4 GB を超えることはできないことに気付きました。Windows で 4GB を超えるファイルを操作する場合、_open、_lseeki64、および _write を使用して成功しました。例えば:
static void
create_file_simple(const TCHAR *filename, __int64 size)
{
int omode = _O_WRONLY | _O_CREAT | _O_TRUNC;
int fd = _topen(filename, omode, _S_IREAD | _S_IWRITE);
_lseeki64(fd, size, SEEK_SET);
_write(fd, "ABCD", 4);
_close(fd);
}
上記は問題なく4GBを超えるファイルを作成します。ただし、そこで_write()を呼び出すと、ファイルシステムが実際にディスクブロックを割り当てる必要があるため、遅くなる可能性があります。ランダムにファイルを埋める必要がある場合は、スパース ファイルを作成する方が速い場合があります。ファイルを最初から順番に埋める場合、上記のコードは問題ありません。fwrite によって提供されるバッファリングされた IO を実際に使用したい場合は、fdopen() を使用して C ライブラリ ファイル記述子から FILE* を取得できることに注意してください。
(誰かが疑問に思っている場合に備えて、TCHAR、_topen、およびアンダースコアのプレフィックスはすべて MSVC++ の癖です)。
アップデート
元の質問は、値 V の N バイトの順次出力を使用することです。したがって、実際に必要なファイルを生成する単純なプログラムは次のとおりです。
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <io.h>
#include <tchar.h>
int
_tmain(int argc, TCHAR *argv[])
{
__int64 n = 0, r = 0, size = 0x100000000LL; /* 4GB */
char v = 'A';
int fd = _topen(argv[1], _O_WRONLY | _O_CREAT| _O_TRUNC, _S_IREAD | _S_IWRITE);
while (r != -1 && n < count) {
r = _write(fd, &v, sizeof(value));
if (r >= 0) n += r;
}
_close(fd);
return 0;
}
ただし、一度に 1 バイトしか書き込まないため、これは非常に遅くなります。これは、より大きなバッファを使用するか、ディスクリプタ (fd) で fdopen を呼び出して fwrite に切り替えることでバッファリングされた I/O を使用することで改善できます。