while (scanf("%s", buff) != EOF)如何终止?
答:ctrl z+换行 是规定,ctrl c 是发送信号杀死进程(一般不建议ctrl c)。
int main()
{string str;while (cin >> str) // operator>>(cin, str){cout << str << endl;}char buff[128];while (scanf("%s", buff) != EOF){printf("%s\n", buff);}return 0;
}

operator bool:本质是为了支持Date对象转换成bool
istream类型对象转换为逻辑条件判断值 实际上我们看到使用while(cin>>i)去流中提取对象数据时,调用的是operator>>,返回值是 istream类型的对象,那么这里可以做逻辑条件值,源自于istream的对象又调用了operator bool,operator bool调用时如果接收流失败,或者有结束标志,则返回false。#include
#include
#include
#include
using namespace std;
class Date
{friend ostream& operator << (ostream& out, const Date& d);friend istream& operator >> (istream& in, Date& d);
public:Date(int year = 1, int month = 1, int day = 1):_year(year), _month(month), _day(day){}// 支持Date对象转换成booloperator bool(){// 这里是随意写的,假设输入_year为0,则结束if (_year < 1)return false;elsereturn true;}
private:int _year;int _month;int _day;
};int main()
{Date d1 = -1;Date d2 = { 2022, 10, 11 };bool ret1 = d1;bool ret2 = d2;cout << ret1 << endl;cout << ret2 << endl;if (d1) 这里本质上也是调用了operator bool{}return 0;
}

#include
#include
using namespace std;int main()
{ifstream ifs("Test.cpp");while (ifs){char ch = ifs.get();cout << ch;}return 0;
}

>>认为空格/换行只是一个间隔,会自动忽略
#include
#include
using namespace std;int main()
{ifstream ifs("Test.cpp");char ch;while (ifs>>ch){cout << ch;}return 0;
}


#include
#include
using namespace std;
struct ServerInfo
{char _address[256];
这里只能用数组,不能string,string是指针,进程A写入,进程B读取string时就是野指针//string _address;int _port;
};struct ConfigManager
{
public:ConfigManager(const char* filename):_filename(filename){}void WriteBin(const ServerInfo& info){// 1 2 4 8 16ofstream 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));}
private:string _filename; // 配置文件
};
int main()
{ServerInfo winfo = { "https://legacy.cplusplus.com/reference/ios/ios/eof/", 80 };二进制写:ConfigManager cf_bin("test.bin"); //打开文件test.bin即可看到cf_bin.WriteBin(winfo);二进制读:ServerInfo rbinfo;cf_bin.ReadBin(rbinfo);cout << rbinfo._address << " " << rbinfo._port << " ";return 0;
}

(5)
struct ServerInfo
{string _address;int _port;Date _d;
};struct ConfigManager
{
public:ConfigManager(const char* filename):_filename(filename){}// 文本读写void WriteText(const ServerInfo& info){// 1 2 4 8 16ofstream ofs(_filename);ofs << info._address << endl;ofs << info._port << endl;ofs << info._d << endl;}void ReadText(ServerInfo& info){ifstream ifs(_filename);ifs >> info._address;ifs >> info._port;ifs >> info._d;}private:string _filename; // 配置文件
};int main()
{ServerInfo winfo = { "https://legacy.cplusplus.com/reference/ios/ios/eof/", 80, {2022, 10, 11} };ConfigManager cf_txt("test.txt");cf_txt.WriteText(winfo);ConfigManager cf_text("test.txt");ServerInfo rtinfo;cf_text.ReadText(rtinfo);cout << rtinfo._address << " " << rtinfo._port << " " << rtinfo._d << endl;return 0;
}