今天在给别人写程序的时候,遇到一个问题,将结构体数组的数据存到文件中,出现了乱码。
下面我写的程序:
struct student
{
int num; //学号
char name[15]; //姓名
char sex[8]; //性别
char className[15]; //班级
};
struct student stu[N]; //定义100个学生的结构体数组
int student_number = 0; //定义学生人数
void save() //保存学生成绩
{
int i;
FILE * fpw;
if (student_number == 0)
{
printf("您现在还没有录入借阅者信息!\n");
return;
}
if ( (fpw = fopen("student.txt", "wb")) == NULL)
{
printf("保存借阅者信息失败!\n");
return;
}
else
{
rewind(fpw); //定位到文件开始的地方
fwrite(&stu[0], sizeof(struct student), student_number, fpw);
/*
提一嘴fwrite的用法:
函数原型:size_t fwrite(const void* restrict ptr, size_t size, size_t nmemb, FILE * restrict fp);
指针ptr是待写入数据块的地址,size 表示待写入数据块的大小(以字节为单位), nmemb表示待写入数据块的数量
*/
fclose(fpw);
printf("保存%d条借阅者成绩成功!\n", student_number);
}
}
这样子的话正常读取和写入都数据都不会出问题,但当打开 student.txt 文件时就会发现有乱码,后面查了一下,fwrite以及fread函数是把二进制数据写入文件,在遇到非字符型的数据时候,显示出来的就是乱码了,解决办法如下:
可以使用 sprintf 函数把多个元素组成一个字符串,再将其写入文件中即可。具体代码如下:
void save() //保存学生成绩
{
int i;
FILE * fpw;
if (student_number == 0)
{
printf("您现在还没有录入借阅者信息!\n");
return;
}
if ( (fpw = fopen("student.txt", "wb")) == NULL)
{
printf("保存借阅者信息失败!\n");
return;
}
else
{
rewind(fpw);
for (i = 0; i < student_number; i++)
{
fprintf(fpw, "%d %s %s %s\n", stu[i].num, stu[i].name, stu[i].sex, stu[i].className);
}
//fwrite(&stu[0], sizeof(struct student), student_number, fpw);
fclose(fpw);
printf("保存%d条借阅者成绩成功!\n", student_number);
}
}
同样的,在读取的时候,也可以用 fscanf 函数,代码如下:
void read()
{
int i = 0;
FILE *fpr; //定义文件指针
fpr = fopen("student.txt", "rb"); //打开文件
if (fpr == NULL)
{
student_number = 0;
printf("读入错误!\n");
return;
}
else
{
rewind(fpr);
while ( fscanf(fpr, "%d%s%s%s", &stu[i].num, stu[i].name, stu[i].sex, stu[i].className) == 4 )
{
student_number++;
i++;
}
printf("读入%d条借阅者记录!\n", student_number);
fclose(fpr); //释放文件指针
}
}
fscanf函数的返回值为成功读入的数的个数,这里为 4 个。