文章目录
C++ IO流的继承体系
C++标准库提供了4个全局流对象cin、cout、cerr、clog,使用cout进行标准输出,即数据从内存流向控制台(显示器)。使用cin进行标准输入即数据通过键盘输入到程序中,同时C++标准库还提供了cerr用来进行标准错误的输出,以及clog进行日志的输出,从上图可以看出,cout、cerr、clog是ostream类的三个不同的对象,因此这三个对象现在基本没有区别,只是应用场景不同。
在使用时候必须要包含文件并引入std标准命名空间。
注意:
-
cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取时,是从缓冲区中拿。如果一次输入过多,会留在那儿慢慢用,如果输入错了,必须在回车之前修改,如果回车键按下就无法挽回了。只有把输入缓冲区中的数据取完后,才要求输入新的数据。
-
输入的数据类型必须与要提取的数据类型一致,否则出错。出错只是在流的状态字state中对应位置位(置1),程序继续。
-
空格和回车都可以作为数据之间的分格符,所以多个数据可以在一行输入,也可以分行输入。但如果是字符型和字符串,则空格(ASCII码为32)无法用cin输入,字符串中也不能有空格。回车符也无法读入。
-
cin和cout可以直接输入和输出内置类型数据,原因:标准库已经将所有内置类型的输入和输出全部重载了:
-
对于自定义类型,如果要支持cin和cout的标准输入输出,需要对<<和>>进行重载。
-
在线OJ中的输入和输出:
对于IO类型的算法,一般都需要循环输入:
输出:严格按照题目的要求进行,多一个少一个空格都不行。
连续输入时,vs系列编译器下在输入ctrl+Z时结束
while(cin>>a)
{
// ...
}
对于cin的返回值istream为什么能做while()的参数
自定义类型转换为内置类型
文件的读写
struct DateManager
{
public:
DateManager(const char* filename)
:_filename(filename)
{}
void WriteText(const Date & d)
{
ofstream ofs(_filename);
ofs << d;
}
void ReadText(Date& d)
{
ifstream ifs(_filename);
ifs >> d;
}
private:
string _filename; // 配置文件
};
int main()
{
Date d1;
DateManager dm("test.txt");
dm.WriteText(d1);
Date d2;
dm.ReadText(d2);
cout << d2;
return 0;
}