69,370
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
//测试文件操作的函数
typedef struct std
{
int num;
char name[20];
int score;
}student;
int main()
{
student s[4];
int i;
printf("请输入4个学生的相学号,姓名,成绩:\n");
for(i=0;i<4;i++)
scanf("%d,%s,%d",&(s[i].num),s[i].name,&(s[i].score));
FILE *fp;
if((fp=fopen("xuesheng","wb"))==NULL)
{
printf("不能打开xuesheng文件!\n");
exit(0);
}
for(i=0;i<4;i++)
{
fwrite(&(s[i]),sizeof(student),1,fp);
}
fclose(fp);
FILE *readf;
if((readf=fopen("xuesheng","rb"))==NULL)
{
printf("读取文件时候,不能打开学生文件!\n");
exit(0);
}
printf("读出文件的内容如下所示:\n");
int j;
for(j=0;j<4;j++)
{
fread(&s[j],sizeof(student),1,readf);
printf("%d,%s,%d\n",s[j].num,s[j].name,s[j].score);
}
fclose(readf);
return 1;
}
student s[4];
memset(s,0,sizeof(struct student) * 4);
把数据初始化完了以后,这样用于内存对齐的空间也被初始化为0了。
这样,你再读取的时候,就不会有乱码存在了。
for(i=0;i<4;i++)
{
fwrite(&(s[i]),sizeof(student),1,fp);
}
这句话写入的是有问题的。
typedef struct std
{
int num;
char name[20];
int score;
}student;
并不是你想象的那样,2个int,一个char数组,
由于有内存对齐的原因(具体的可以百度),所以struct std
除了你定义的那几个类型外,还有占用了一些空间用于内存对齐。
用sizeof(struct std)可以看到具体使用的字节数。
正确的写法应该是:
for(i=0;i<4;i++)
{
char buf[128] = {0};
sprintf(buf, "%d,%s,%d", s[i].num, s[i].name, s[i].score);
fwrite(buf,sizeof(char),strlen(buf),fp);
}
[/code]