C语言fread与fwrite将结构体数组元素写入读出文件时遇到int类型乱码问题的解决

首先看下处理之前的代码。其中boya结构体数组用于将数据写入文件,boyb数组用于将文件中的数据读出到boyb

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <bits/stdc++.h>
using namespace std;
struct stu{
	char name[10];
	int num;
	int age;
}boya[2],boyb[2];
int main() {
	
	FILE *fp;
	fp = fopen("C:\\Users\\甜甜不哭\\Desktop\\复试\\jdfs\\笔记\\struct.txt","w+");	
	if(fp==NULL) {
		perror("fopen");
		return 0;
	}
	for(int i=0;i<2;i++){  //对结构体数组元素赋值
		scanf("%s %d %d",boya[i].name,&boya[i].num,&boya[i].age);
	}
	fwrite(boya,sizeof(struct stu),2,fp);   //将结构体数组元素写入文件
	rewind(fp); //写完后指针在文件末尾,需要复位
	fread(boyb,sizeof(struct stu),2,fp);    //从文件中读入结构体数组
	fclose(fp);
	for(int i=0;i<2;i++){    //打印
		printf("%s %d %d\n",boyb[i].name,boyb[i].num,boyb[i].age);
	}
	return 0;
}

跑下代码,输入:

李瑞 14 22
张三 16 21

在这里插入图片描述
下面是文件内容
在这里插入图片描述
乱码原因:
fwrite/fread 处理的是二进制字符
fwrite 函数是将内存中的数据原样输出到文件中。
fread 函数是将文件中的数据原样读取到内存里。

问题解决

fprintf/fscanf 处理的是文本文件,其都有三个参数:
1.文件指针
2.写入/读出的格式
3.结构体数组中的所有数据
将fwrite/fread 换成 fprintf/fscanf 后

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <bits/stdc++.h>
using namespace std;
struct stu{
	char name[10];
	int num;
	int age;
}boya[2],boyb[2];
int main() {
	
	FILE *fp;
	fp = fopen("C:\\Users\\甜甜不哭\\Desktop\\复试\\jdfs\\笔记\\struct.txt","w+");	
	if(fp==NULL) {
		perror("fopen");
		return 0;
	}
	for(int i=0;i<2;i++){
		scanf("%s %d %d",boya[i].name,&boya[i].num,&boya[i].age);
	}//boyb[i].name 不加地址符号是因为数组名字已经表示首地址
//	fwrite(boya,sizeof(struct stu),2,fp);
	for (int i = 0; i < 2; i++)
	{
		fprintf(fp, "%s %d %d\n", boya[i].name,boya[i].num,boya[i].age);
	}
	rewind(fp);
//	fread(boyb,sizeof(struct stu),2,fp); 
	for (int i = 0; i < 2; i++)
	{
		fscanf(fp, "%s %d %d\n", boyb[i].name,&boyb[i].num,&boyb[i].age);
	}//boyb[i].name 不加地址符号是因为数组名字已经表示首地址
	fclose(fp);
	for(int i=0;i<2;i++){
		printf("%s %d %d\n",boyb[i].name,boyb[i].num,boyb[i].age);
	}
	return 0;
}

执行代码,输入:

李瑞 14 22
张三 16 21

结果
在这里插入图片描述
文件中数据也成了文本格式了
在这里插入图片描述

  • 16
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值