在C中使用fread时无法读取二进制文件

问题描述 投票:0回答:1

我在使用C中的fread读取二进制数据时遇到问题。

所以这是我需要读取的二进制文件。

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

[如果有人可以帮助我,那会很棒。

c binary fread
1个回答
0
投票

正如我在屏幕快照中所看到的并得到您的确认,您在二进制数据之前有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);
}
© www.soinside.com 2019 - 2024. All rights reserved.