我试图从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);
}
我认为我走在正确的轨道上,不过感谢任何帮助。
答案 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
参数。