从C中的文本文件中读取8位二进制数

时间:2015-02-25 17:58:03

标签: c file parsing text

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

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

等。 。

Heres有点像我想做的事情

伪代码

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);

}

我认为我走在正确的轨道上,不过感谢任何帮助。

5 个答案:

答案 0 :(得分:0)

这不是标准曲目,但没关系。您正在扫描读取int的文件,因此它将读取字符串并将其解释为十进制数,您应该转换为对应的二进制数,即将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位不会)。

更常见的方法是直接读取字符串并解码字符串,或者通过char读取char并进行增量转换。

答案 1 :(得分:0)

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

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);

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

答案 2 :(得分:0)

我认为这是一个可行的解决方案,我简单易懂,因此您可以理解并适应您的需求。您只需要为每一行重复此操作。

#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;
}

答案 3 :(得分:0)

我不知道为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

答案 4 :(得分:0)

逐行阅读文件,然后使用基数2的{​​{3}}。

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