C++ C、 C++;从二进制文件中提取结构成员

C++ C、 C++;从二进制文件中提取结构成员,c++,c,struct,binary,fopen,C++,C,Struct,Binary,Fopen,我使用以下代码从二进制文件中提取结构成员 我想知道为什么会打印多次?当文件中只有一个ID记录和一个结构时。我只需要访问这个成员,最好的方法是什么 我真的不明白while循环在做什么?是否正在测试文件是否已打开并在该点之前返回1 为什么在while循环中使用fread fread是否需要设置为结构成员的特定大小 printf语句是否读取二进制文件并输出int FILE *p; struct myStruct x; p=fopen("myfile","rb"); while(1) { si

我使用以下代码从二进制文件中提取结构成员

我想知道为什么会打印多次?当文件中只有一个ID记录和一个结构时。我只需要访问这个成员,最好的方法是什么

我真的不明白while循环在做什么?是否正在测试文件是否已打开并在该点之前返回1

为什么在while循环中使用fread

fread是否需要设置为结构成员的特定大小

printf语句是否读取二进制文件并输出int

FILE *p;
struct myStruct x;
p=fopen("myfile","rb");

while(1) {
    size_t n = fread(&x, sizeof(x), 1, p);
    if (n == 0) {
        break;
    }
    printf("\n\nID:%d", x.ID);  // Use matching specifier
    fflush(stdout); // Insure output occurs promptly
}
fclose(p);
return 0;
结构如下所示:

struct myStruct
{
    int cm;    
    int bytes;          
    int ID; 
    int version; 
    char chunk[1];     
}

不是一个真正的答案,而是回答一个评论

照办

FILE *p = fopen("myfile","rb");
struct myStruct x;

size_t n = fread(&x, sizeof(x), 1, p);
if (n != 1) {
    // Some error message
} else {
    printf("\n\nID:%d\n", x.ID);
}

...Do as you wish with the rest of the file
在线回答

我想知道为什么会打印多次?当文件中只有一个ID记录和一个结构时。我只需要访问这个成员,最好的方法是什么

文件大小是2906字节,fread一次只读取17个字节,这是一个循环

我真的不明白while循环在做什么?是否正在测试文件是否已打开并在该点之前返回1

fread返回成功读取的元素总数

为什么在while循环中使用fread

在这种情况下,while是不必要的。一个弗瑞德就够了。Fread有时用于while循环,当处理来自其他源(如UART)的输入时,程序必须等待读取所述字节数

fread是否需要设置为结构成员的特定大小

不,读取整个结构会更好

printf语句是否读取二进制文件并输出int

FILE *p;
struct myStruct x;
p=fopen("myfile","rb");

while(1) {
    size_t n = fread(&x, sizeof(x), 1, p);
    if (n == 0) {
        break;
    }
    printf("\n\nID:%d", x.ID);  // Use matching specifier
    fflush(stdout); // Insure output occurs promptly
}
fclose(p);
return 0;
没有

我想知道为什么会打印多次?当文件中只有一个ID记录和一个结构时

不会的!因此,如果您有多个打印,可能的解释是该文件包含的不仅仅是一个结构。另一种解释可能是,文件(也称为结构)的保存方式与您用于读取的方式不同

我只需要访问这个成员,最好的方法是什么

我觉得你的方法很好

我真的不明白while循环在做什么

因为代码应该能够从文件中读取多个结构,所以存在
while
。使用
while(1)
的意思是“永远循环”。要摆脱这种循环,请使用
break
。在您的代码中,
break
发生在无法从文件中读取更多结构时,即如果(n==0){break;}

是否正在测试文件是否已打开并在该点之前返回1

否-见上面的答案

为什么在while循环中使用fread

如上所述:能够从文件中读取多个结构

fread是否需要设置为结构成员的特定大小

嗯,
fread
没有“设置”任何内容。它被告知要读取多少个元素以及每个元素的大小。因此,您可以使用
sizeof(x)
来调用它

printf语句是否读取二进制文件并输出int

FILE *p;
struct myStruct x;
p=fopen("myfile","rb");

while(1) {
    size_t n = fread(&x, sizeof(x), 1, p);
    if (n == 0) {
        break;
    }
    printf("\n\nID:%d", x.ID);  // Use matching specifier
    fflush(stdout); // Insure output occurs promptly
}
fclose(p);
return 0;
否,读数由fread执行。是,
printf
输出十进制值

您可以尝试以下代码:

#include <stdio.h>
#include <unistd.h>

struct myStruct
{
    int cm;    
    int bytes;          
    int ID; 
    int version; 
    char chunk[1];     
};

void rr()
{
  printf("Reading file\n");

  FILE *p;
  struct myStruct x;
  p=fopen("somefile","rb");

  while(1) {
    size_t n = fread(&x, sizeof(x), 1, p);
    if (n == 0) {
      break;
    }
    printf("\n\nID:%d", x.ID);  // Use matching specifier
    fflush(stdout); // Insure output occurs promptly
  }
  fclose(p);
}

void ww()
{
  printf("Creating file containing a single struct\n");

  FILE *p;
  struct myStruct x;
  x.cm = 1;    
  x.bytes = 2;          
  x.ID = 3; 
  x.version = 4; 
  x.chunk[0] = 'a';     

  p=fopen("somefile","wb");

  fwrite(&x, sizeof(x), 1, p);
  fclose(p);
}



int main(void) {
  if( access( "somefile", F_OK ) == -1 ) 
  {
    // If "somefile" isn't there already, call ww to create it
    ww();
  }

  rr();
  return 0;
}
#包括
#包括
结构myStruct
{
int-cm;
整数字节;
int-ID;
int版本;
字符块[1];
};
void rr()
{
printf(“读取文件”);
文件*p;
结构myStruct x;
p=fopen(“somefile”、“rb”);
而(1){
尺寸n=fread(&x,尺寸f(x),1,p);
如果(n==0){
打破
}
printf(“\n\nID:%d”,x.ID);//使用匹配的说明符
fflush(stdout);//确保及时输出
}
fclose(p);
}
void ww()
{
printf(“创建包含单个结构的文件\n”);
文件*p;
结构myStruct x;
x、 cm=1;
x、 字节=2;
x、 ID=3;
x、 版本=4;
x、 区块[0]=“a”;
p=fopen(“somefile”、“wb”);
fwrite(&x,sizeof(x),1,p);
fclose(p);
}
内部主(空){
if(访问(“somefile”,F_OK)=-1)
{
//如果“somefile”不存在,请致电ww创建它
ww();
}
rr();
返回0;
}

<代码>为什么你不确定这是C还是C++?你知道你是怎么编译的。。。对吗?我可以同时使用这两个…2906比4个整数的大小大得多-通常是16字节-因此不止一个结构我想你已经回答了这个问题question@Ke. <代码>抱歉,最后有一大块我忘了包含在结构中
那么你应该更新你的Q,这样读者就不会对大小不匹配感到困惑。这是为了确保文件中只有一个结构,是吗?@4386427-你说得对-我匆忙中做了一个决定mistake@tobi303-不-但我的意见和你一样。。。这意味着我不太明白这个答案是什么,但是我也不太明白问题是什么,里面有太多的
,这只是打印了ID:0,我确定x.ID中有一个6位数左右的ID,我可能使用了错误的类型还是什么?有没有办法测试ID成员中是否存在数据?