【问题标题】:reading from binary and stocking on double array of char从二进制读取并存储在双数组char上
【发布时间】:2017-07-08 00:03:59
【问题描述】:

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

【问题讨论】:

  • “因为在循环内打印 r15 显示正确的值”是无关紧要的。它必须为 5 大以容纳 4 个字符,并且 printf 将附加一个空字符,因此需要将其声明为 5 大。你在这里很幸运。

标签: c arrays file io binary


【解决方案1】:

看看:

 r15[counter-1]=r;

你把r的地址赋给数组,但是你想把r的值赋给数组,所以使用:

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

...并且r 必须为 5 大以包含终止的 null。

此外,在分配存储空间时,您必须为每个字符串分配 5 个字节。请阅读您关于 C 的书中的字符串。

【讨论】:

  • 当我使用 strcpy 时,我收到警告:内置函数“strcpy”的隐式声明不兼容,即使更改 r 大小后也没有任何变化
  • 添加:#include &lt;string.h&gt;。你是否为每个数组元素分配了 5 个字节的 malloc?
  • 我确实包含了字符串并更改了大小
  • 我运行了你的程序,它运行良好,符合我的建议。 counter 必须初始化为 0,并且不能从计数器中减去该 1。
  • 我将计数器更改为零,仍然没有运气,但我找到了替换r15[counter]=r; with r15[counter][0]=r[0] ...的解决方案
猜你喜欢
  • 2015-09-12
  • 2020-03-07
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多