【发布时间】:2017-02-02 07:52:18
【问题描述】:
我正在使用以下代码在 Windows 上的 MSVC 中打开一个大 (5.1GB) 二进制文件。这台机器有足够的内存。问题是长度被检索为零。但是,当我将 file_path 更改为较小的 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也是如此,你如何期望这个值代表任何大于2GB的数字?请参阅您的 Microsoft 文档,了解使用大小超过 2 GB 的文件的正确方法。 -
使用second one。
-
@mezamorphic 尚未注意到,但您假设您对
fseek()的调用有效。 FWIW,fseek()/ftell()不是获取文件大小的符合 C 标准的方法。二进制文件不需要支持fseek(..., SEEK_END);,并且ftell()为文本文件返回的值不是有意义的字节数。 -
又是一个很好的例子,表明人们应该总是测试相关函数调用的结果。 (至少在这里
fseek())。 -
对于非常大的文件,你想用
_ftelli64替换ftell,返回一个64位类型
标签: c++ c file c++11 large-files