C语言文件输出时,输入数据后为什么会出现乱码

源代码及测试结果如下
#include"stdio.h"
#define SIZE 2
struct studentType
{
char name[10];
int num;
int age;
char addr[15];
} stud[SIZE];
void save()
{
FILE *fp;
int i;
if((fp=fopen("stuList","w"))==NULL)
{
printf("cannot open the file\n");
return;
}
for(i=0;i<SIZE;i++)
{
if(fwrite(&stud[i],sizeof(struct studentType),1,fp)!=1)
printf("file write error!\n");
}
fclose(fp);
}
int main()
{
int i;
for(i=0;i<SIZE;i++)
scanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age,stud[i].addr);
save();
}
输入数据

结果

if(fwrite(&stud[i],sizeof(struct studentType),1,fp)!=1) 简单看了下,这行有问题,往文件里写的时候是把一个字符串写进去,stud[i]是一个struct,强行把它序列化的话,内存中的存储不是连续的,这样写就会写入一些没用的数据,导致出错。考虑一下怎么把struct序列化,再看看struct的中的字节是怎么对齐的,建议而已
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-12-14
fwrite(&stud[i],sizeof(struct studentType),1,fp)

你这种写入方式是直接将这个数据的内存原封不动的拷贝到文件当中。

在C语言中,内存中的结构体的存储并不是所有数据连续的。
你可以在网络上搜索一下结构体的对齐原则。
这种原则是C语言中,结构体存储结构的原理。

如果你希望能更好的理解。本回答被网友采纳
第2个回答  2015-11-05
可能是输入缓冲区之前未清空
使用这个函数将文件缓冲区清空
memset(buffer,0,sizeof(buffer));
头文件在#include<stdlib.h>中
第3个回答  2012-12-14
fwrite函数保存数据时整型数据将会保存为对应的ASCII字符
比如48就会被保存为‘0’
相似回答