文件读写
#include<bits/stdc++.h>
using namespace std;
// ==============================================================
// 类:学生
class Student{
public:
char id[20]; //用char——> 避免string二进制读写问题!
char name[20];
int grade;
/* 未定义【构造函数】
——>编译器会自动生成该类的【默认构造函数】
对all成员执行<默认初始化> */
};
//=====(1) 写入单个学生信息到文件(模式:【二进制】&【追加】)=====
void saveStd(Student& std, const char* filename){
/* 【传参】: 学生std & 文件名(const【只读】避免被修改!) */
ofstream fout(filename, ios::binary|ios::app); //1》实例化
if(!fout){ //2》检查是否打开成功
cout<<"打开文件失败"<<endl;
return;
}
/*write()
参1: char* 指向要写入数据的【指针】
参2:写入字符数(对象大小) */
////3》写入一行到文件:某学生std的信息————Student结构体类型
fout.write((char*)&std, sizeof(Student));//&std std对象的【地址】
fout.close(); //4》关闭资源
}
//========(2) 读取文件所有学生信息并打印(模式:【二进制】)========
void printStd(const char* filename){
/* 【传参】: 文件名(const避免被修改) */
ifstream fin(filename, ios::binary);
if(!fin){
cout<<"打开文件失败!"<<endl;
}
system("chcp 65001"); //解决乱码
Student std;
//读取每一行————>while
while(fin.read((char*)&std, sizeof(std))){ //并打印
cout<<"学号:"<<std.id
<<"姓名:"<<std.name
<<"成绩:"<<std.grade<<endl;
}
fin.close();
}
// =============== (3) 文件复制(模式:【二进制】)==============
void copyFile(const char* src, const char* dest){
/* 参1:源文件【读】 参2:复制文件【写】 */
ifstream fin(src, ios::binary);
ofstream fout(dest, ios::binary);
if(!fin || !fout){
cout<<"文件打开失败!"<<endl;
return;
}
Student std;
while(fin.read((char*)&std, sizeof(std))){
fout.write((char*)&std, sizeof(std));
//整个stu对象的内存内容(所有成员变量的数据)都写入文件中
}
fin.close();
fout.close();
}
// ===================== 主函数示例用法 ======================
int main(){
system("chcp 65001"); //solve乱码 change code page 六五一
int n;
cin>>n;
//动态分配一个数组(数据类型:Student类)
Student* std = new Student[n];
//(一)【保存单个学生信息到文件】
for(int i=0;i<n;i++){
cin>>std[i].id>>std[i].name>>std[i].grade;
saveStd(std[i], "D:\\data.dat");
}
//(二)【读取所有学生信息并打印】
printStd("D:\\data.dat");
//(三)【复制文件】备份
copyFile("D:\\data.dat", "D:\\backup.dat");
delete[] std; //【释放】动态内存!!!
return 0;
}
/*
(一)ios::binary|ios::app 不是||,只有一条|
(二)new[]————————delete[]记得释放!!!
3
13 Taylor 100
14 Ryan 99
34 Etia 100
*/