Я использую приведенный ниже код, чтобы открыть большой (5.1GB) двоичный файл в MSVC в Windows. Машина имеет много оперативной памяти. Проблема заключается в том, что длина восстанавливается как ноль. Однако, когда я изменяю путь 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 гигабайта? Проконсультируйтесь с документацией Microsoft, чтобы использовать файлы размером более 2 гигабайт. –
Используйте [второй] (https://msdn.microsoft.com/en-us/library/0ys3hc0b.aspx). –
Собираетесь ли вы в режиме 32 или 64 бит? Вам нужно будет убедиться, что вы компилируете в режиме 64 бит, чтобы создать буфер 5.1 ГБ. (в дополнение к проблемам 'ftell()', указанным выше комментариями) – Cornstalks