读取二进制和放在双数组char上

时间:2017-02-18 12:41:43

标签: c arrays file io binary

我必须从二进制文件中获取一个特定的2bytes值,在循环打印中r15 [i]显示正确的值(0000,fff6,....),但在循环外,遍历r15再次显示只有一个值0100。 从文件中读取我逐字节完成并连接两个值并将其保存在r15 [counter]中。所以我的问题是,这是从二进制文件中读取2字节值的正确方法吗?是什么让数组r15在循环结束时更改其值?

  char **r15;
  r15 = (char **) malloc(sizeof(char *)*50000);

   for(i=0; i<50000; i++) r15[i] = (char *) malloc(sizeof(char)*5);

 fp = fopen("file.bin", "rb");

 if (fp == NULL)    {
    printf("fail opning file\n");
    exit(EXIT_FAILURE);}        

 int i; 
 int check;
 char r[5];
 unsigned int counter=1;


  while((check=getc(fp)) != EOF){
      fseek(fp,32*counter-2, SEEK_SET);

      fread(buffer,1,2,fp);

      sprintf (r, "%02x%02x", buffer[0], buffer[1]);
      r15[counter-1]=r;
      printf("r15[%d] %s\n",counter-1,r15[counter-1]);

      counter++;
  }

// result here diffrent than printing inside while loop
for(i=0;i<counter-1;i++) printf("r15[%d] %s\n",i,r15[i]);

edit1:在将r尺寸更改为5之后,循环内打印的值与外部打印的值不同。 edit2:我通过替换:

找到了解决方案
   r15[counter]=r; or strcpy(r15[counter],r);

由此:

   r15[counter][0]=r[0];
   r15[counter][1]=r[1];
   r15[counter][2]=r[2];
   r15[counter][3]=r[3];

但我仍然不知道为什么它不能用于strcpy strncpy和r15 [counter] = r

1 个答案:

答案 0 :(得分:0)

看看:

 r15[counter-1]=r;

您将r的地址分配给数组,但是您想将r的值分配给数组,因此请使用:

strcpy( r15[counter-1], r);

... r必须大5才能包含终止空值。

同样,在分配存储时,您必须为每个字符串分配5个字节。请阅读有关C语言的书中的字符串。