Как я вижу на скриншоте и также подтверждено вами, у вас есть 5 строк нормальных данных перед двоичными данными ... Для нас есть несколько вариантов ... оба связаны с использованием "fgets" в тандеме с"fread" ..
"fgets", потому что он останавливается, а также записывает новую строку при обнаружении. Это позволяет нам точно позиционировать указатель файла перед чтением в двоичных данных, используя «fread». Пара вариантов позиционирования указателя файла:
"ftell" вместе с "fseek"
OR
"fgetpos "и" fsetpos "
Код ниже, документирует оба подхода, но я пошел с" fgetpos "и" fsetpos ". Надеюсь, что комментарии полезны.
#include <stdio.h>
int main(){
int n = 0; //to use in "ftell"
int i = 0; //as a counter
FILE * fp;
char array[100];//in case you want to store the normal characters received from "fgets"
fpos_t ptr;//used to record file pointer position in fgetpos and fsetpos
size_t num;
FILE *fp = fopen("binaryXYZRGB.nkt", "rb");
while(i < 5){//since there are 5 lines
fgets(array+n,sizeof array,fp);//stores these lines in array
//n = ftell(fp);//use this with fseek, post 5 iterations "n" would be the offset
i++; // of binary data from the start of the file.
}
//fseek(fp,n,SEEK_SET);//can use this instead of fgetpos/fsetpos
//the offset "n" collected above is used
//printf("%s",array);//if array needs to be printed
fgetpos(fp,&ptr);//get the current position of the file pointer
fsetpos(fp,&ptr);//set the current position of the file pointer
int counter = 0;
while(1){
struct read a;
num = fread(&a, 1, sizeof(a), fp);
if(num < 1){ //have brought the break condition above the print statement
break;
}
printf("%d-) %f %f %f %d %d %d\n", counter, a.x, a.y, a.z, a.r, a.g, a.b);
counter++;
}
fclose(fp);
}