C语言将结构体数组数据写入到文件中以及从文件中分组读取不同类型的数据,以及解决fwrite造成的乱码问题

今天在给别人写程序的时候,遇到一个问题,将结构体数组的数据存到文件中,出现了乱码。
下面我写的程序:

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 个。

  • 21
    点赞
  • 112
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值