我正在尝试从文件中读取以下二进制文件(01100001)并将其转换为ascii代码(97),但是当使用fread时我得到了一个非常大的数字。 文件“c:/input.txt”仅包含以下行-01100001 printf的数组值打印大数字,例如825241648
我的代码:
int main()
{
unsigned int arr[8];
int cnt,i,temp=0;
FILE * input;
if(!(input=fopen("C:/input.txt","r")))
{
fprintf(stderr,"cannot open file\n");
exit(0);
}
cnt = fread(arr,1,8,input);
for(i=0;i<cnt;i++)
{
printf("%d\n",arr[i]);
}
return 0;
}
任何想法为什么?
答案 0 :(得分:3)
arr
是一个整数数组。但是你只读了8个字节。因此,您的第一个整数将具有一些较大的值,您的第二个也将如此,但之后它们将具有垃圾值。 (你使arr
成为一个“自动”变量,它在堆栈上分配,因此它会有随机垃圾;如果你把它变成一个静态变量,它会被预先初始化为零字节。)
如果您更改arr
的声明以使其类型为char
,则可以读取您的字符串,并且您的for
循环将一次循环一个字节
然后你可以编写一个字符串到二进制的翻译器,或者你可以使用strtol()
进行转换,并将基集设置为2. strtol()
并非在所有编译器中都可用;海湾合作委员会很好,但微软C没有它。
答案 1 :(得分:2)
PL。看看下面的代码(在Linux上使用gcc编译)是否适用于此。
#include<stdio.h>
#include<stdlib.h>
int main()
{
char arr[8];
int cnt,i,temp=0;
FILE * input;
if((input=fopen("data","r"))==NULL)
{
fprintf(stderr,"cannot open file\n");
exit(1);
}
//Read the 8 bytes in a character array of size 8
cnt = fread(arr,1,8,input);
for (i = 0; i < cnt; i++)
{
//Now change it to 0/1 form by substracting 48
arr[i] = arr[i] - '0';/* Ascii of 0 = 48*/
//Also Left shift..
arr[i] = arr[i] << (cnt - (i+1));
//Now Bit wise OR with the integer...
temp = temp | arr[i];
}
printf("The ascii value is %d and the character is %c\n", temp, temp);
return 0;
}
答案 2 :(得分:1)
首先声明unsigned int arr[8];
,这意味着8个整数,或者更确切地说是8 * 4 = 32个字节。之后,您读取8个字节,然后再次尝试输出8个整数。我想你想要读取8个字节并将它们作为数字输出?如果您将类型int
更改为char
,则代码可能会有效。如果文件大小为32个字节并包含整数,您可能需要更改fread(),如下所示:fread(arr,sizeof(int),8,input);