前言
大家好吖,欢迎来到 YY 滴 系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁
主要内容含:
一.C++文件IO流基本知识
1)采用文件流对象操作文件的一般步骤:
- 定义一个文件流对象
- 使用文件流对象的成员函数打开一个磁盘文件,使得文件流对象和磁盘文件之间建立联系
- 使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写
- 关闭文件
2)定义一个文件流对象
C++中定义一个文件流对象有三种
- ifstream ifile(只输入用)
- ofstream ofile(只输出用)
- fstream iofile(既输入又输出用)
3)文件内容的数据格式分类
- C++根据文件内容的数据格式分为 二进制文件 和 文本文件
4)从“输入输出”角度理解——>文件IO和基础IO记忆(cout&cin)
- 在基础IO中——cout是读操作,cin是写操作
- 而在文件IO中——cout是写操作,cin是读操作
- 我们可以这么理解:
- 基础IO中,我们操作的对象是键盘,输入对象是显示器,cout把程序的内容输出给显示器(读),cin把键盘的内容输出给显示器(写);
- 在文件IO中,我们操作的对象是文件,cout把程序的内容输出给文件(写),cin把文件输出给显示器(读);
二.C++文件IO流操作完整演示(代码)
struct ServerInfo { char _address[32]; // 二进制读写不能用string vector这样的对象存数据 // 否则写出去就是一个指针,进程结束就是野指针,另一个进程再读进来进坑了 //string _address; int _port; Date _date; }; struct ConfigManager { public: ConfigManager(const char* filename = "file.txt") :_filename(filename) {} // 二进制读写 -- 简单高效,缺点:写到文件中的内容看不懂 void WriteBin(const ServerInfo& info) { ofstream ofs(_filename, ios_base::out | ios_base::binary);//定义一个文件流对象 ofs.write((const char*)&info, sizeof(info)); } void ReadBin(ServerInfo& info) { ifstream ifs(_filename, ios_base::in | ios_base::binary);//定义一个文件流对象 ifs.read((char*)&info, sizeof(info)); } //文本读写 void WriteText(const ServerInfo& info) { ofstream ofs(_filename);//定义一个文件流对象 ofs << info._address << " " << info._port << " " << info._date; } void ReadText(ServerInfo& info) { ifstream ifs(_filename);//定义一个文件流对象 ifs >> info._address >> info._port >> info._date; } private: string _filename; // 配置文件 }; int main() { ServerInfo winfo = { "192.0.0.1111111111111111111", 80, { 2022, 4, 10 } }; ConfigManager cm("test.bin"); cm.WriteBin(winfo); return 0; } int main() { ConfigManager cf_bin("test.bin"); ServerInfo rbinfo; cf_bin.ReadBin(rbinfo); cout << rbinfo._address << " " << rbinfo._port << " " << rbinfo._date << endl; return 0; } int main() { ServerInfo winfo = { "192.0.0.1111111111111111111", 80, { 2022, 4, 10 } }; ConfigManager cm("test.txt"); cm.WriteText(winfo); return 0; } int main() { ConfigManager cf_bin("test.txt"); ServerInfo rbinfo; cf_bin.ReadText(rbinfo); cout << rbinfo._address << " " << rbinfo._port << " " << rbinfo._date << endl; return 0; } int main() { ifstream ifs("Test.cpp"); char ch; while (ifs.get(ch)) { cout << ch;//全读 } return 0; }