2

我正在编写一个程序,该程序从两个单独文件中的两个表创建一个查找表。当我阅读第一张表格时,一切都被正确阅读。但是,当我阅读第二个文件时,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;

PS:我一直在尝试查找结构_cnt中的确切内容,但FILE找不到任何类似的东西。我将不胜感激任何人都可以提供的任何指示。

4

3 回答 3

2

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

fp = fopen(filename, "rb");

还要检查 fread 的返回值,如果它的字节数比您预期的少,请检查 ferror 代码。

于 2012-09-04T21:54:52.573 回答
0

您的代码看起来不错,尽管您应该检查fread. 如果您正在研究 的内部结构FILE,那么您只是在寻求混淆。 _cnt可能与在内存中缓冲了多少文件有关。它不是 API 的一部分,因此没有记录,您不应该查看它。

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

于 2012-09-04T20:21:18.247 回答
0

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

我将在这里提出答案而不是继续讨论;如果我不在基地,我会删除。

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

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

于 2012-09-04T20:38:15.487 回答