您好我在linux上使用gcc -Wall -std = c99和a./out运行此C程序。我没有收到任何警告/错误。但是当我打印从文件中读取的信息时,我会得到疯狂的输出。该文件包含:
A13
B99
C2
D2
E44
F32
G2
H9
,输出为:
id: A
size: 171522370
id: C
size: 876939826
id: 4
size: 843516466
代码是
typedef struct record{
char id;
int size;
}record;
int main ()
{
record reg;
FILE *fp = NULL;
fp = fopen("idSize.txt", "r");
if ((fp = fopen("idSize.txt", "r")) == NULL){
printf("error opening file");
exit(1);
}
fread(®, sizeof(reg),1,fp);
while (!feof(fp)){
printf("id: %c\n", reg.id);
printf("size: %d\n", reg.size);
fread(®, sizeof(reg),1,fp);
}
fclose(fp);
return 0;
}
任何帮助将非常感谢!谢谢lott
答案 0 :(得分:3)
您的fread
正在从文件中读取二进制信息,而不是它实际包含的文本。是的,我的意思是它希望在文件中找到你的结构的内存映像,这取决于你的实现。
因此,例如(虽然这一切都根据您的实现的填充行为和类型大小而有所不同),但可能需要一个单字节char
后跟三个填充字节,然后是四字节二进制表示int
。
您应该考虑使用fscanf
代替,它可以为您转换。举例来说,以下代码:
#include <stdio.h>
typedef struct record {
char id;
int size;
} record;
int main (void) {
record reg;
FILE *fp;
if ((fp = fopen ("idSize.txt", "r")) == NULL) {
printf ("Error opening file\n");
return 1;
}
while (fscanf (fp, "%c%d\n", &(reg.id), &(reg.size)) == 2)
printf ("id: %c, size: %d\n", reg.id, reg.size);
fclose(fp);
return 0;
}
产生
id: A, size: 13
id: B, size: 99
id: C, size: 2
id: D, size: 2
id: E, size: 44
id: F, size: 32
id: G, size: 2
id: H, size: 9