fopen не открывает файл полностью

Я пишу программу, которая создает таблицу поиска из двух таблиц, которые находятся в двух отдельных файлах. Когда я читаю первую таблицу, все читается правильно. Тем не менее, когда я читаю второй файл, 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 структура, и я не могу найти ничего подобного. Я был бы признателен за любые указания, которые может дать каждый.

2

Решение

Похоже, вы читаете двоичный файл в текстовом режиме. Попробуйте добавить «b» к флагам в fopen:

fp = fopen(filename, "rb");

Также проверьте возвращаемое значение fread и, если оно меньше байтов, чем вы ожидали, проверьте код ошибки.

2

Другие решения

Ваш код выглядит нормально, хотя вы должны проверить возвращаемые значения fread, Если вы смотрите во внутренности FILEВы только просите замешательство. _cnt Вероятно, связано с тем, сколько файлов буферизируется в памяти. Он не является частью API, и поэтому не документирован, и вы не должны на него смотреть.

В чем конкретно проблема? Когда делает fread потерпеть неудачу и что это возвращает?

0

Да, я могу читать значения, и они верны. Проблема в том, что после определенного момента, fread начинает возвращать то же значение.

Я собираюсь выйти на конечность здесь с ответом, а не продолжением обсуждения; Я удалю, если я вне базы.

Я ожидаю, что происходит, что вы прочитали все содержимое вашего файла, однако вы не прекратили читать; последующие вызовы fread () возвращают ошибку (которую вы не проверяете) и не изменяют содержимое вашего буфера чтения.

Либо проверьте возврат fread (), либо позвоните feof() чтобы проверить ваш статус, или оба.

0
По вопросам рекламы [email protected]