gpt4 book ai didi

c++ - 无法打开存在的二进制文件

转载 作者:太空宇宙 更新时间:2023-11-04 09:33:08 29 4
gpt4 key购买 nike

我无法打开该特定文件(从 here 获取,它在 gist.tar.gz 中),但是我可以打开查询文件并正确读取它。怎么了?也许问题在于文件对我来说太大了?但我认为如果是这种情况,我可以打开它然后收到 bad_alloc。什么的。

这是发生了什么:

samaras@samaras-A15:~/parallel/rkd_forest/code$ ./rkd_sam 
I/O error : Unable to open the file ../Datasets/gist/gist_base.fvecs
samaras@samaras-A15:~/parallel/rkd_forest/code$ cd ../Datasets/gist/
samaras@samaras-A15:~/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);

文件的权限如下: enter image description here

它的大小是 3.8 GB(3,844,000,000 字节),我知道这个数据集是 too big for this computer .

结果我 moved到另一台机器,但我遇到了同样的问题。

那里的内存(它是 64 位,而我的电脑运行在 32 位上):

gsamaras@geomcomp:~/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|

值取自 cmd 和我正在执行的代码:

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;
}
...
}

我也尝试移动包含数据集的文件夹,但我得到了相同的结果!

最佳答案

你得到的错误是EOVERFLOW,这是你读到的the open manual page意味着

pathname refers to a regular file that is too large to be opened. The usual scenario here is that an application compiled on a 32-bit platform without -D_FILE_OFFSET_BITS=64 tried to open a file whose size exceeds (1<<31)-1 bytes; see also O_LARGEFILE above. This is the error specified by POSIX.1-2001; in kernels before 2.6.24, Linux gave the error EFBIG for this case.

这意味着您在 32 位平台上并尝试打开一个大到无法在没有特殊考虑的情况下处理的文件。

要么使用 -D_FILE_OFFSET_BITS=64 重新编译您的程序,要么使用带有 O_LARGEFILE 标志的 open 调用。

关于c++ - 无法打开存在的二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29447042/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com