Я не могу открыть этот конкретный файл (получил его от here, он находится внутри gist.tar.gz), однако я могу открыть файл запроса, например, и прочитать его правильно. Что не так? Может быть, проблема заключается в том, что файл слишком большой для меня? Но я подумал, что если бы это было так, я мог бы открыть его, а затем получить bad_alloc
или что-то в этом роде.Невозможно открыть существующий двоичный файл
Вот что происходит:
[email protected]:~/parallel/rkd_forest/code$ ./rkd_sam
I/O error : Unable to open the file ../Datasets/gist/gist_base.fvecs
[email protected]:~/parallel/rkd_forest/code$ cd ../Datasets/gist/
[email protected]:~/parallel/rkd_forest/Datasets/gist$ ls
gist_base.fvecs gist_groundtruth.ivecs gist_learn.fvecs gist_query.fvecs
Вот мой код (должно быть в порядке):
FILE* fid;
fid = fopen(filename, "rb");
if (!fid)
printf("I/O error : Unable to open the file %s\n", filename);
Вот разрешения файла:
и его размер составляет 3,8 ГБ (3,844,000,000 байт), а I знает, что этот набор данных too big for this computer.
В результате я moved на другой компьютер, но у меня такая же проблема.
Память есть (это 64 бита, в то время как мой компьютер работает на 32 бит):
[email protected]:~/Desktop/code$ free -mt
total used free shared buffers cached
Mem: 3949 3842 106 0 173 3186
-/+ buffers/cache: 483 3466
Swap: 10867 59 10808
Total: 14816 3901 10914
std::cerr << "Error: " << strerror(errno) << std::endl;
дал
Error: Value too large for defined data type
printf("|%s|\n", filename);
дал
|../Datasets/gist/gist_base.fvecs|
и значение берется из ЦМД и в коде я это делаю:
readDivisionSpacefvecs<FT>(test, N, D, argv[8]); // in main()
, а затем
void readDivisionSpacefvecs(Division_Euclidean_space<T>& ds, int& N, int& D, char* filename) {
FILE* fid;
fid = fopen(filename, "rb");
printf("|%s|\n", filename);
if (!fid) {
printf("I/O error : Unable to open the file %s\n", filename);
std::cerr << "Error: " << strerror(errno) << std::endl;
}
...
}
я также попытался переместить папку, содержащую набор данных, но я получил тот же результат!
Использование, например. ['strerror'] (http://en.cppreference.com/w/cpp/string/byte/strerror), чтобы узнать фактическую ошибку. –
напечатайте код ошибки (errno) или используйте функцию C для поиска текста ошибки. Открытие файла не сработает просто потому, что файл слишком велик. Что-то еще не так. –
@JoachimPileborg отредактирован. Интересно, какой джим! – gsamaras