在 C 中使用 fread 读取整数时出错
Error while reading integers using fread in C
我编写了以下 C 代码以从输入文件中读取 5 个整数:
#include<stdio.h>
#include<stdlib.h>
int main(){
FILE *fp;
unsigned *ch;
unsigned i,n=5;
ch=(unsigned*)malloc(n*sizeof(unsigned));
fp=fopen("input","r");
fread(ch ,sizeof(unsigned),n,fp);
fclose(fp);
for(i=0;i<n;i++)
printf("\n%u ",ch[i]);
free(ch);
return 0;
}
输入文件是:
1 2 3 4 58
但我得到的输出是:
540155953
540287027
14389
0
0
请帮帮我。
fread 和 fwrite 用于二进制文件。二进制文件中的数据被解释为字节,因为它们将出现在内存中,而不是人类可以读取的文本文件。在 linux 上使用 hexdump
命令,我们可以看到输入文件
的十六进制值
$ hexdump -C input
00000000 31 20 32 20 33 20 34 20 35 38 0a
使用ASCII table的十六进制列,可以看到0x31是第1个字符,0x20是space字符,等等。但是因为fread
解释数据在文件为二进制文件,它将为每个 unsigned int
读取 4 个字节。您可以检查 0x20322031(文件中倒序的前 4 个字节)是否等于 540155953.
如果想将文件中的数据生成二进制文件,然后读取,可以使用
#include<stdio.h>
#include<stdlib.h>
int main(){
FILE *fp;
unsigned *ch;
unsigned i,n=5;
unsigned int arr[] = {1,2,3,4,58};
ch=(unsigned*)malloc(n*sizeof(unsigned));
fp=fopen("input","w+");
fwrite(arr,sizeof(unsigned),n,fp); /* write binary */
fseek(fp, SEEK_SET, 0); /* move file cursor back to the start of the file */
fread(ch ,sizeof(unsigned),n,fp); /* read binary */
fclose(fp);
for(i=0;i<n;i++)
printf("\n%u ",ch[i]);
free(ch);
return 0;
}
并检查名为 input
的文件以查看差异。
如评论中所述,如果您想将数据解释为文本文件,您可以 fscanf
使用 %u
说明符来抓取 unsigned int
s。
我编写了以下 C 代码以从输入文件中读取 5 个整数:
#include<stdio.h>
#include<stdlib.h>
int main(){
FILE *fp;
unsigned *ch;
unsigned i,n=5;
ch=(unsigned*)malloc(n*sizeof(unsigned));
fp=fopen("input","r");
fread(ch ,sizeof(unsigned),n,fp);
fclose(fp);
for(i=0;i<n;i++)
printf("\n%u ",ch[i]);
free(ch);
return 0;
}
输入文件是:
1 2 3 4 58
但我得到的输出是:
540155953
540287027
14389
0
0
请帮帮我。
fread 和 fwrite 用于二进制文件。二进制文件中的数据被解释为字节,因为它们将出现在内存中,而不是人类可以读取的文本文件。在 linux 上使用 hexdump
命令,我们可以看到输入文件
$ hexdump -C input
00000000 31 20 32 20 33 20 34 20 35 38 0a
使用ASCII table的十六进制列,可以看到0x31是第1个字符,0x20是space字符,等等。但是因为fread
解释数据在文件为二进制文件,它将为每个 unsigned int
读取 4 个字节。您可以检查 0x20322031(文件中倒序的前 4 个字节)是否等于 540155953.
如果想将文件中的数据生成二进制文件,然后读取,可以使用
#include<stdio.h>
#include<stdlib.h>
int main(){
FILE *fp;
unsigned *ch;
unsigned i,n=5;
unsigned int arr[] = {1,2,3,4,58};
ch=(unsigned*)malloc(n*sizeof(unsigned));
fp=fopen("input","w+");
fwrite(arr,sizeof(unsigned),n,fp); /* write binary */
fseek(fp, SEEK_SET, 0); /* move file cursor back to the start of the file */
fread(ch ,sizeof(unsigned),n,fp); /* read binary */
fclose(fp);
for(i=0;i<n;i++)
printf("\n%u ",ch[i]);
free(ch);
return 0;
}
并检查名为 input
的文件以查看差异。
如评论中所述,如果您想将数据解释为文本文件,您可以 fscanf
使用 %u
说明符来抓取 unsigned int
s。