1. 二进制文件的读与写ofstream fout; ifstream fin;
——学习把结构体类型写到二进制文件中。
代码实现:
/*
_4.cpp 学习总结 视频学习C++_Primer_Plus_17_6
1. 二进制文件的读与写
2. 写操作:fout类比cout操作,cout能操作的fout也适用
3. 易错点1:读写操作时,读in,写out,不可写错易错点2:写操作时,添加要求时,貌似或(|)与或之间的顺序也要注意
4. fout.write((char *) &p1, sizeof p1);解释两个参数参数1:地址。&p1表示地址,(char *)强转,固定,参数2:字节大小。读函数同理类知识中对这个两个函数有详细讲解
*/
#include <iostream>
#include <fstream>
#include <iomanip> //输出格式用//内联函数吃没用的字符
inline void eatline() { while(std::cin.get() != '\n') continue; }struct Planet
{char name[20];double papolation;double g;
};//结构体星球const char* filename = "plants.dat";int main()
{using namespace std;//写进二进制文件ofstream fout(filename, ios_base::out | ios_base::app | ios_base::binary);Planet p1; cout << "以空白行结束输入:" << endl;cin.get(p1.name, 20);while(p1.name[0] != '\0'){eatline();//吃没用的字符//输入星球数据cin >> p1.papolation;cin >> p1.g;eatline();//吃没用的字符//写操作fout.write((char *) &p1, sizeof p1);cout << "以空白行结束输入:" << endl;cin.get(p1.name, 20);}fout.close();//读二进制文件ifstream fin;fin.open(filename, ios_base::in | ios_base::binary);if(!fin.is_open()){cout << "打不开此文件:" << filename << endl;exit(EXIT_FAILURE);}cout << fixed;//不用科学计数法显示cout.precision(2);//精度保留两位小数cout.setf(ios_base::showpoint);//显示小数点,不写(输入135.0,显示135)cout << "读文件并显示:" << endl;while(fin.read((char *) &p1, sizeof p1)){cout << "Name: " << p1.name << endl;cout << "Population: " << p1.papolation << endl;cout << "G: " << p1.g << endl;}fin.close();return 0;
}
2. 在二进制文件的任意位置进行存储或者修改 fstream finout;
——修改二进制文件中的结构体内容。
代码实现:
/*
_5.cpp 学习总结 视频学习C++_Primer_Plus_17_7
1. 修改二进制文件中的结构体内容planet.dat二进制文件已存在(内容为4个Planet)该示例将完成以下工作:a. 询问要修改哪条记录b. 显示未修改的记录 c. 显示已修改的记录2. seekg():将输入指针移至指定的文件位置seekp():将输出指针移到指定文件位置原型1:seekg(streampos) streampos place = rec * sizeof p1;原型2:seek(streamoff, ios_base::seekdir) 未应用
3. fstream finout; 读写都可以
*/
#include <iostream>
#include <fstream>
#include <iomanip> //输出格式用//内联函数吃没用的字符
inline void eatline() { while(std::cin.get() != '\n') continue; }struct Planet
{char name[20];double papolation;double g;
};//结构体星球const char* filename = "plants.dat";int main()
{using namespace std;Planet p1;fstream finout;//打开二进制文件,可能读也可能写,planet.dat二进制文件已存在(内容为4个Planet)finout.open("planets.dat", ios_base::in | ios_base::out | ios_base::binary);if(!finout.is_open()){cout << "打不来此文件:planets.dat" << endl;exit(EXIT_FAILURE); }//修改第 rec 个结构体的内容,rec(0,1,2,3...),place即是第rec的首地址cout << "输入要修改的第几个结构体内容(0,1,2,3): ";int rec; cin >> rec; eatline();streampos place = rec * sizeof p1;//文件输出指针重新定位finout.seekg(place);//把该位置的内容存到p1内finout.read((char *)&p1, sizeof p1);//显示该位置本来内容cout << "显示该位置本来内容: " << endl;cout << "Name: " << p1.name << endl;cout << "Poluation: " << p1.papolation << endl;cout << "G: " << p1.g << endl;//输入要修改的的内容:cout << "输入要修改的的内容:" << endl;cout << "Name: ";cin >> p1.name;cout << "Population: ";cin >> p1.papolation;cout << "G: ";cin >> p1.g;eatline();//文件输入指针重新定位,然后写入finout.seekp(place);finout.write((char *)&p1, sizeof p1);//再次显示该位置内容:cout << "再次显示该位置内容:" << endl;finout.seekg(place);finout.read((char *)&p1, sizeof p1);cout << "Name: " << p1.name << endl;cout << "Poluation: " << p1.papolation << endl;cout << "G: " << p1.g << endl;return 0;
}
3. 知识点。
常量 | 含义 |
---|---|
ios_base::in | 打开文件,以便读取 |
ios_base::out | 打开文件 |
ios_base::out | 打开文件,以便写入 |
ios_base::app | 追加到文件末尾 |
ios_base::trunc | 如果文件存在,清空文件内容 |
ios_base::binary | 二进制文件 |
C++模式 | C模式 | 含义 |
---|---|---|
ios_base::in | “r” | 打开文件,以便读取 |
ios_base::out | “w” | 等价于ios_base::out | ios_base::trunc |
ios_base::out | ios_base::trunc | “w” | 打开以写入,如果文件存在,先清空文件 |
ios_base::out | ios_base::app | “a” | 打开以写入,只追加 |
ios_base::in | ios_base::out | “r+” | 打开以读写,在文件允许的位置写入 |
ios_base::in | ios_base::out | ios_base::trunc | “w+” | 打开以读写,如果文件按存在,清空文件 |