2

2つの別々のファイルにある2つのテーブルからルックアップテーブルを作成するプログラムを書いています。最初の表を読むと、すべてが正しく読み取られています。ただし、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;

_cntPS:私は構造の中に正確に何があるかを調べようとしてきましたがFILE、そのようなものは何も見つかりません。どなたでもご意見をいただければ幸いです。

4

3 に答える 3

2

テキストモードでバイナリファイルを読んでいるようです。fopenのフラグに「b」を追加してみてください。

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 に答える