【问题标题】:Read 8 Bit Binary Numbers from text File in C从 C 中的文本文件中读取 8 位二进制数
【发布时间】:2015-04-27 20:58:33
【问题描述】:

我正在尝试从 C 中的一个文本文件中读取,其中包含要在另一个函数中使用的 8 位二进制数列表。

The text file is formatted like:
01101101
10110110
10101101
01001111
11010010
00010111
00101011

等。 . .

这就是我想要做的事情

伪代码

void bincalc(char 8_bit_num){ 
//does stuff 
}

int main()
{
    FILE* f = fopen("test.txt", "r");
    int n = 0, i = 0;
while( fscanf(f, "%d ", &n) > 0 ) // parse %d followed by a new line or space
{
    bincalc(n);

}

fclose(f);

}

我认为我在正确的轨道上,但是任何帮助表示赞赏。

【问题讨论】:

  • 只需阅读整行(fgets 或 fscanf(f, "%s...)),然后逐行解析。
  • 您的建议无效。以这种方式读取的十进制数比char 可以存储的要大远,您最多只能以这种方式存储三个“但”。将 十进制 解析为二进制是可能的,但将实际字符解析为字符串可能更容易。
  • 代码正在读取一个 int(4 个字节)并且 bincalc 函数需要一个 char(1 个字节)建议通过读取 8 个字符并将它们压缩成一个 8 位字符来将输入转换为 char然后使用压缩结果调用 bincalc 函数
  • @user3629249: ...但是当然在那个函数中没有什么可做的...

标签: c file parsing text


【解决方案1】:

这不是标准的做法,但没关系。您正在扫描读取ints 的文件,因此它将读取字符串并将它们解释为十进制数,您应该依次将其转换为对应二进制,即将十进制1010转换为2^3+ 2^1=9 十进制。这当然是可能的,您只需将 10 的幂变换到 2 的幂(1.10^3+0.10^2+1.10^1+0.10^0 到 1.2^3+0.2^2+ 1.2^1+0.2^0)。请注意,这适用于 8 位数字,但不适用于太大的数字(16 位不会)。

比较常见的方式是读取字符串直接解码字符串,或者逐字符读取,进行增量转换。

【讨论】:

    【解决方案2】:

    如果你想在最后有一个数字,我建议如下:

    int i;
    char buf[10], val;
    FILE* f = fopen("test.txt", "r");
    
    while( ! feof(f) ) {
      val = 0;
      fscanf(f, "%s", buf);
      for( i=0; i<8; i++ )
        val = (val << 1) | (buf[i]-48);
      /* val is a 8 bit number now representing the binary digits */
      bincalc(val);
    }
    
    fclose(f);
    

    这只是一个简短的 sn-p 来说明这个想法,并没有涵盖有关文件或缓冲区处理的所有极端情况。无论如何,我希望它会有所帮助。

    【讨论】:

    • feof() 在尝试读取文件末尾之后才有效。一般来说,永远不要使用 feof 来控制循环,这个答案的其余部分看起来不错
    【解决方案3】:

    我认为这是一个可能的解决方案,我将其简化,以便您可以理解并适应您的需求。您只需对每一行重复此操作即可。

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
       FILE *file =fopen("data","r");
       char *result=calloc(1,sizeof(char));
       char line[8];
       int i=0;
    
       for(;i<8;i++)
       {
          char get = (char)getc(file);
          if(get == '0')
             *result <<= 1;
          else if(get == '1')
             *result = ((*result<<1)|0x1) ;
       }
    
       printf("->%c\n",*result);
       return 0;
    }
    

    【讨论】:

      【解决方案4】:

      我不知道如何为fscanf() 指定二进制格式,但您可以像这样转换二进制字符串。

      #include <stdio.h>
      #include <stdlib.h>
      
      void fatal(char *msg) {
          printf("%s\n", msg);
          exit (1);
      }
      
      unsigned binstr2int(char *str) {
          int i = 0;
          while (*str != '\0' && *str != '\n') {   // string term or newline?
              if (*str != '0' && *str != '1')      // binary digit?
                  fatal ("Not a binary digit\n");
              i = i * 2 + (*str++ & 1);
          }
          return i;
      }
      
      int main(void) {
          unsigned x;
          char inp[100];
          FILE *fp;
          if ((fp = fopen("test.txt", "r")) == NULL)
              fatal("Unable to open file");
          while (fgets(inp, 99, fp) != NULL) {
              x = binstr2int(inp);
              printf ("%X\n", x);
          }
          fclose (fp);
          return 0;
      }
      

      文件输入

      01101101
      10110110
      10101101
      01001111
      11010010
      00010111
      00101011
      

      程序输出

      6D
      B6
      AD
      4F
      D2
      17
      2B
      

      【讨论】:

        【解决方案5】:

        逐行读取文件,然后使用strtol() 和基址2。

        或者,如果保证文件不长,您也可以读取(动态分配的)内存中的全部内容并使用endptr参数。

        【讨论】:

          猜你喜欢
          • 2021-09-07
          • 2015-11-11
          • 1970-01-01
          • 2023-03-13
          • 2021-08-17
          • 2019-04-04
          • 2014-10-26
          • 1970-01-01
          • 2016-01-20
          相关资源
          最近更新 更多