Не могу прочитать двоичный файл, пока я использую fread в C - PullRequest
0 голосов
/ 22 октября 2019

У меня проблема с чтением двоичных данных с использованием fread в C.

Итак, вот бинарный файл, который мне нужно прочитать.

https://i.stack.imgur.com/7qfK6.png

Моя проблема в том, что файл имеет нормальный текст в пять строк, и я не могу понять, как их избежать или прочитать их как текст, и когда двоичная часть начинает читать двоичные данные.

Вот мой код:

size_t num;
FILE *fp = fopen("binaryXYZRGB.nkt", "rb");

if(fp == NULL){
    printf("HATA!!!\n");
    exit(1);
}

int counter = 0;
while(1){

    struct read a;
    num = fread(&a, 1, sizeof(a), fp);
    printf("%d-) %f %f %f %d %d %d\n", counter, a.x, a.y, a.z, a.r, a.g, a.b);

    counter++;

    if(num < 1){
        break;
    }
}

и прочитайте структуру:

struct read{
 float x;
 float y;
 float z;
 int r;
 int g;
 int b;  
};

Возможно, я прочитал что-то вроде этого

https://i.stack.imgur.com/ZYUbY.png

, но я прочитал это,

https://i.stack.imgur.com/fbaqd.png

Если кто-то может мне помочь, это будет здорово.

1 Ответ

0 голосов
/ 24 октября 2019

Как я вижу на скриншоте и также подтверждено вами, у вас есть 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);
}
...