fopen不会完全打开文件

时间:2012-09-04 20:16:27

标签: c++ file file-io file-structure

我正在编写一个程序,它从两个独立文件中的两个表创建一个查找表。当我读第一张表时,所有内容都被正确读取。但是,当我读取第二个文件时,fopen似乎无法打开整个文件。

我这样说是因为编译器实现了_iobuf文件结构,并且_cnt似乎比第一次初始化时_cnt = 530初始化了_cnt ~ 4096 int vertical,horizontal,channels,count; FILE *fp; fp = fopen(filename,"r"); if(fp==NULL){ cout << "File not found" << endl; return Mat(); }else{ cout << "Opening and Reading " << filename << endl; } //Read header fread(&count,4,1,fp); cout << "ReadHistogram(): Count number is " << count; if(count!= 5){ cout << "Header file reads: " << count << endl; return Mat(); } //Read size fread(&vertical,4,1,fp); //cout << "ReadHistogram(): Vertical size:" << vertical <<endl; fread(&horizontal,4,1,fp); //cout << "ReadHistogram(): Horizontal size:" << horizontal <<endl; fread(&channels,4,1,fp); //cout << "ReadHistogram(): Channel size:" << channels<<endl; //Create Mat array int size[] = {vertical, horizontal, channels}; Mat histogram(3,size,CV_64F,Scalar::all(0)); //Read in array count = 0; for(int i=0;i<vertical;i++){ for(int j=0;j<horizontal;j++){ for(int k=0;k<channels;k++){ double temp5; fread(&temp5,8,1,fp); histogram.at<double>(i,j,k) = temp5; if(count <= 300){ cout << "Array(" << i+1 << "," << j+1 << "," << k+1 << ")" << "=" << histogram.at<double>(i,j,k) << endl; cout << "Temp5 is " << temp5 << endl; } count++; } } } cout << "Done reading " << filename << endl; fclose(fp); return histogram; 当我从文件中读取它时,它会减少。

以下是我的代码片段:

_cnt

PS:我一直试图查找FILE结构中{{1}}的确切内容,但我找不到任何类型的内容。我很感激任何人都可以提供的任何指示。

3 个答案:

答案 0 :(得分:2)

看起来你正在以文本模式阅读二进制文件。尝试将“b”添加到fopen中的标志:

fp = fopen(filename, "rb");

同时检查fread的返回值,如果它的字节数少于预期,请检查错误代码。

答案 1 :(得分:0)

您的代码看起来很好,但您应该检查fread的返回值。如果你正在研究FILE的内部,你只是要求混淆。 _cnt可能与内存中缓冲了多少文件有关。它不是API的一部分,因此没有记录,你不应该看它。

究竟是什么问题? fread何时失败以及它返回什么?

答案 2 :(得分:0)

  

是的,我可以阅读价值观并且他们是正确的。问题在于,在某一点之后,fread开始返回相同的值。

我会在这里找到一个答案,而不是继续讨论;如果我偏离基地,我会删除。

我预计发生的事情是你已经阅读了文件的全部内容,但是你还没有停止阅读;后续对fread()的调用返回一个错误(你没有检查),也没有修改读缓冲区的内容。

检查fread()的返回,或致电feof()检查您的状态,或两者兼而有之。