首先看下处理之前的代码。其中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
结果
文件中数据也成了文本格式了