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

时间:2015-04-04 13:32:49

标签: c++ linux file-io binary

我无法打开该特定文件(从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;
  }
  ...
}

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

2 个答案:

答案 0 :(得分:2)

您收到的错误是EOVERFLOW,您读到the open manual page表示

  

pathname 指的是一个太大的常规文件   打开。这里通常的情况是应用程序   在没有 -D_FILE_OFFSET_BITS=64 的32位平台上编译   试图打开一个大小超过(1 <&lt;&lt; 31)-1字节的文件;看到   也是O_LARGEFILE以上。这是指定的错误   POSIX.1-2001;在2.6.24之前的内核中,Linux给出了错误   对于这种情况EFBIG

这意味着您在32位平台上尝试打开一个简单易用的文件,无需特殊考虑。

使用-D_FILE_OFFSET_BITS=64重新编译您的程序,或使用open标记直接使用O_LARGEFILE调用。

答案 1 :(得分:0)

程序似乎试图在当前目录(code)中打开该文件,而该文件位于另一个(Datasets/gist'). You did not provide the value of the filename`变量中,但它应包含完整路径正确工作的文件。

你可以尝试

cd ../Datasets/gist/
../../code/rkd_sam

如果filename仅包含没有任何路径的基本名称,则此方法应该有效。

fopen()而言,文件的大小根本不重要。