本节主要看代码理解
I/O流继承关系
iostream
主要类 cin cout cerr clog
while(cin>>str)
{
//处理
}
当接收ctrl z 或 ctrl c时,会停止, 原理:重载操作符bool,令指定istream为false
清理cin缓存
if (cin.fail()){cin.clear();char ch;while (cin.get(ch)){//cout << ch;}}
cin.clear
ctrl z后cin都不可用,因为cin前会检查goodbit
cin.clear() 可恢复cin,使其可用
ctrl c 直接杀进程
四种文件状态,用一个整形表示,不同二进制位表不同状态
eofbit
failbit
badbit
goodbit
向int 中cin整形加字符(22s)
int会在第一个非整型前停下,剩下的加到缓存区,留给下个cin
cin.get(ch)
将cin缓存区第一个字符给ch并删除,类似pop,可用于清空缓存(结合clear)
I/O提速
解决cin,cout效率比printf/scanf低下
加上
ios_base::sync_with_stdio(false) //关闭C/C++同步
cin.tie(nullptr)//解除绑定关系
cout.tie(nullptr)//解除绑定关系
fstream
向文件写入/出数据
1.直接写二进制
struct ServerInfo
{//char _address[32];string _address;int _port;Date _date;
};struct ConfigManager
{
public:ConfigManager(const char* filename):_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));}// 21:15继续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.1111111111111111111111", 80, { 2022, 4, 10 } };
//
// // 二进制读写
// ConfigManager cf_bin("test.bin");
// cf_bin.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;
//}
写string等有指针的会有大坑
2.都转成字符串(重载流插入流提取)
ofstream
int main()
{ofstream ofs("test.txt");//ofs.open("test.txt");ofs.put('x');ofs.write("hello\n", 6);ofs << "22222222" << endl;int x = 111;double y = 1.11;ofs << x << endl;ofs << y << endl;//ofs.close();return 0;
}
ifstream
int main()
{//ifstream ofs("test.cpp");ifstream ofs("D:\\360MoveData\\Users\\xjh\\Desktop\\8-10.png", ios_base::in | ios_base::binary);int n = 0;while (!ofs.eof()){char ch = ofs.get();//cout << ch;++n;}cout << n << endl;return 0;
}
stringstream
将其看成控制台我们与程序交互即可, 我们输入的是都字符串,但程序会根据接收值类型自动转为整形/浮点数, 还会对多参数对象自动调用构造函数(不是重载)
#include<sstream>//int main()
//{
// int i = 123;
// Date d = { 2022, 4, 10 };
// ostringstream oss;
// oss << i << endl;
// oss << d << endl;
//
// string s = oss.str();
// cout << s << endl;
//
// //istringstream iss(s);
// //istringstream iss;
// //iss.str("100 2024 9 9");
// istringstream iss("100 2024 9 9");
// int j;
// Date x;
// iss >> j >> x;
//
// return 0;
//}// json库struct ChatInfo
{string _name; // 名字int _id; // idDate _date; // 时间string _msg; // 聊天信息
};int main()
{// 结构信息序列化为字符串ChatInfo winfo = { "张三", 135246, { 2022, 4, 10 }, "晚上一起看电影吧" };ostringstream oss;oss << winfo._name << " " << winfo._id << " " << winfo._date << " " << winfo._msg;string str = oss.str();cout << str << endl << endl;// send(str);// str = recv()ChatInfo rInfo;istringstream iss(str);iss >> rInfo._name >> rInfo._id >> rInfo._date >> rInfo._msg;cout << "-------------------------------------------------------" << endl;cout << "姓名:" << rInfo._name << "(" << rInfo._id << ") ";cout << rInfo._date << endl;cout << rInfo._name << ":>" << rInfo._msg << endl;cout << "-------------------------------------------------------" << endl;return 0;
}