2012-09-04 62 views
2

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

我这样说是因为编译器实现了_iobuf文件结构和_cnt似乎当首次初始化(_cnt ~ 4096)整体要低不少(_cnt = 530),而不是被初始化,当我从文件中读取它降低。

这里是我的代码片段:

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; 

PS:我一直在试图查找究竟是在FILE结构_cnt,我找不到任何的排序。我会很感激任何人可以给的指针。

+0

你能读取文件的全部内容吗? – mah

+0

是的,我可以读取值,但只有在for循环的开始是正确的值。问题在于,在某个点之后,fread开始返回与文件中包含的值不同的值。 –

+1

如果你先读第二个文件会发生什么?这两次之间有什么变化?是否有涉及线程?您是否在同一时间在其他地方使用该文件?尽量缩短你的功能。请发布[SSCCE](http://sscce.org/)。 –

回答

2

它看起来像你正在阅读文本模式下的二进制文件。尝试在FOPEN加入“B”的标志:

fp = fopen(filename, "rb"); 

同时检查的fread的返回值,如果它比你预期更少的字节,检查FERROR代码。

+0

+1,当以文本模式打开文件时,字节0x1A被识别为文件结束标记。 –

+0

啊! KK非常感谢你! :) –

0

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

究竟是什么问题? fread何时失败,返回什么?

+0

当我开始阅读文件时,fread返回的所有值都是正确的。然而,在某个点之后,fread开始一遍又一遍地返回相同的值。我提到_cnt的唯一原因是因为当_cnt = 0时fread开始读取相同的值。 –

+0

引起我问题的fread是嵌套for循环中的那个。 –

+0

对不起。我说过fread返回的所有值都是正确的。这只适用于第一对价值观。但是在某个点之后,它开始一遍又一遍地返回相同的值。 –

0

是的,我可以读取值,他们是正确的。问题在于,在某个点之后,fread开始返回相同的值。

我打算在这里用一个答案而不是继续讨论;如果我不在基地,我会删除。

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

请检查fread()的返回情况,或者拨打feof()来检查您的状态,或两者都检查。

+0

我同意,但事实是它的实际文件包含的值比程序正在读取的更多。我有两个与我阅读的尺寸完全相同的文件。当我读完整个第一个文件时,所有内容都被正确读取。当我读第二个文件时,问题就出现了。两个文件的大小相同。 –

+0

在这种情况下,大小相同并不重要,因为程序认为大小是基于内容的;如果这些内容是错误的(并建议有更多的数据比真实的,基于垂直,水平和通道),那么你的程序将继续调用fread()。 – mah

+0

那么,我在一个matlab程序中使用相同的文件,但matlab正在读取所有的值。 –