C++中,输入输出是基于字节流(stream)的操作。在进行操作的时候,可以把输入的数据堪称逐个字节地从外设流入到计算机内部。输出则是逐个字节流出到外设。
C++中有C语言保留下来的输入输出函数,比如scanf和printf,这是过程式的。
还有C++ I/O库中的类和对象,可以实现面向对象的输入/输出,例如,I/O库中的对象cin可以实现键盘的输入,cout可以用于显示字符。
cout 就是一个对象。它是 C++ 标准库根据 ostream 这个类提前为我们创建好的一个具体实例。它的任务就是把数据输出到控制台(显示器)。
cin 也是一个对象。它是根据 istream (输入流) 这个类创建的实例,专门负责从键盘读取数据。
我们使用 cout 时,就是在操作一个具体的“输出流对象”,命令它把我们的数据显示出来。比如:
int age = 20;cout << "My age is: " << age; // 我们命令 cout 对象,把字符串和变量 age 的值显示出来。一. 面向控制台的IO
1. 控制台输入
cin 也是一个对象。它是根据 istream (输入流) 这个类创建的实例。同理cout 是 ostream 类的对象。

这张图非常重要,它告诉我们:
ios 是这个家族的“老祖宗”,它定义了一些所有 I/O 流都共有的基础属性和功能(比如管理流的状态)。
istream (输入流) 和 ostream (输出流) 都继承自 ios。istream 专注于输入,定义了 >> 操作符。ostream 专注于输出,定义了 << 操作符。
iostream 同时继承了 istream 和 ostream,所以它既能输入也能输出。
ifstream, ofstream, fstream 等是用来操作文件的,原理类似,我们以后会学到。
在使用I/O库的时候,首先要创建I/O对象,然后调用这个对象进行基于字节流代码输入/输出操作。这些对象有些有重载了 >> 和 << 运算符,可以用于基本数据类型的输入和输出。
istream in(...); // 手动创建一个输入对象in >> my_variable; // 输入给变量
ostream out(...); // 手动创建一个输出对象out << "Hello";但是我们好像很少这样子写,我们写的总是
cin >> my_variable;cout << "Hello";没有遇到过 istream in(...) 这种写法,是因为 C++ 标准库已经提前帮你把这件事做好了。
针对控制台的输入/输出,在I/O库中预先定义了四个I/O对象cin,cout,cerr以及clog。这些可以直接用。这四个对象都是在头文件iostream中定义的。所以要
#include <iostream>2. 控制台输出
和输入类似的,不过要注意,输出指向字符的指针的时候,不是输出指针的值,而是自动转换成了它所指向的字符串。
const char *p = "Hello world!";
cout << p; // 输出字符串 Hello world!cout << (void *)p;输出控制符
我们有的时候会用到
#include <iostream>#include <iomanip>
cout << "abc" << endl;这里endl是回车,这实际上就是操纵符。
可以用hex操纵符把后续的输出格式改成十六进制。(是后续,也就是说不改回来这个程序里就一直这样了)
#include <iostream>#include <iomanip>using namespace std;
int main() { int x = 10; cout << hex << x << x << oct << x << endl; cout << x ; return 0;}
可以看到不手动切回来,后续就一直这样子了。

3. 重载>>,<<
如果有个类:
class A { int x, y;};要直接输出:
class A { int x, y;
friend ostream& operator << (ostream& out, const A &a); // 访问私有对象要声明友元};
ostream& operator << (ostream& out, const A &a) { out << a.x << a.y;}二. 面向文件的IO
(下面的都略了,看书就好了,不过这里都会考)