私は以下のコードを使用して、Windows上のMSVCで大きな(5.1GB)バイナリファイルを開きます。マシンにはたくさんのRAMがあります。問題は、長さがゼロとして取得されていることです。しかし、file_pathをより小さなASCIIファイルに変更すると、コードは正常に動作します。小さなバイナリファイルではなく、小さなASCIIファイルを開くことができますか?
大きなバイナリファイルを読み込めないのはなぜですか?私はファイルの内容へのポインタを必要としたので、このアプローチを好む。
FILE * pFile;
uint64_t lSize;
char * buffer;
size_t result;
pFile = fopen(file_path, "rb");
if (pFile == NULL) {
fputs("File error", stderr); exit(1);
}
// obtain file size:
fseek(pFile, 0, SEEK_END);
lSize = ftell(pFile); // RETURNS ZERO
rewind(pFile);
// allocate memory to contain the whole file:
buffer = (char*)malloc(sizeof(char)*lSize);
if (buffer == NULL) {
fputs("Memory error", stderr); exit(2);
}
// copy the file into the buffer:
result = fread(buffer, 1, lSize, pFile); // RETURNS ZERO TOO
if (result != lSize) { // THIS FAILS
fputs("Reading error", stderr); exit(3);
}
/* the whole file is now loaded in the memory buffer. */
ファイルのパーミッションでもなくても、それは問題ありません。
'ftell()'によって返される値が4バイトの整数で、 'long'もそうである場合、この値がどのように2ギガバイトを超える数値を表すと思いますか?サイズが2ギガバイトを超えるファイルを使用する適切な方法については、Microsoftのマニュアルを参照してください。 –
[2番目のもの](https://msdn.microsoft.com/en-us/library/0ys3hc0b.aspx)を使用してください。 –
32ビットまたは64ビットモードでコンパイルしていますか? 5.1GBのバッファを作成するには、64ビットモードでコンパイルしていることを確認する必要があります。 (上のコメントで指摘されている 'ftell()'の問題に加えて) – Cornstalks