一、iostream
iostream库又叫做标准输入输出库(Standard Input / Output Streams Library),它包含两个基础类型:istream和ostream,分别表示输入流和输出流。其中定义了4个IO对象:
cin是istream对象,称为标准输入(standard input)
cout是ostream对象,称为标准输出(standard output)
另外还有两个ostream对象:cerr(标准错误)和clog(用来输出运行时的日志信息)
一般系统把程序运行窗口和这些对象关联,读取cin时就会从窗口读取,向cout、cerr和clog写数据时,会写到窗口。
要使用iostream库,首先要包含该头文件
1 |
#include <iostream> |
但是,之后还不能直接使用cout,这是因为c++中引入了命名空间(namespace)的概念,它可以帮助避免一些命名冲突的问题。标准库中定义的名字都在命名空间std中,当使用时需要通过作用域运算符(::)来指出。这样使用cout就应该用std::cout。
向流写入数据(输出)
一个输出hello world的例子如下:
1 2 3 4 5 6 7 |
#include <iostream> int main() { std::cout << "hello world" << std::endl; return 0; } |
其中endl是一个特殊的操纵符,它的效果是结束当前行,并将缓冲区的内容写入到设备。
左移运算符<<在c++中又称为输出运算符,它左侧是ostream对象,右侧就是要输出的值,作用就是在输出对象上打印消息。由于它的运算结果正好是左侧的那个ostream对象,因此可以连用:
1 |
std::cout << "hello" << "world"; |
std::cout << “hello”的结果还是std::cout,上面这句话相当于两句:
1 2 |
std::cout << "hello"; std::cout << "world"; |
命名空间
除了每次使用std::使用标准库中的名字,还可以使用using声明来一劳永逸。它的格式如下:
1 |
using namespace::name; |
使用之后可以直接访问这个name
1 2 3 4 5 6 7 8 |
#include <iostream> using std::cout; using std::endl; int main() { cout << "hello world" << endl; return 0; } |
还可以直接使用using指示,引入一个命名空间的所有名字
1 2 3 4 5 6 7 |
#include <iostream> using namespace std; int main() { cout << "hello world" << endl; return 0; } |
使用之后,可以直接使用std下面的所有名字。一般不推荐使用,因为std中有很多名字,可能会和你自己的变量名字冲突。
从流读取数据(输入)
右移运算符>> 也称为输入运算符,它左侧是一个istream对象,右侧是要写入内容的对象。它从istream中读取数据,并写入到右侧的对象中。和<<类似,它的结果也是左侧的istream对象,因此也可以连用
1 2 3 4 5 6 7 8 9 |
#include <iostream> using namespace std; int main() { int a, b; cin >> a >> b; cout << a << "+" << b << "=" << a+b << endl; return 0; } |
当需要读取的数据个数未知时,可以检测cin对象的值。下面是一个计算求和的例子
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <iostream> using namespace std; int main() { int sum = 0, value; while (cin >> value) { sum += value; } cout << "sum = " << sum; return 0; } |
当遇到文件结束符(end-of-file,windows命令行中可以通过Ctrl+z模拟)或者遇到无效输入(上例中输入不是数字)时,istream对象的状态会变为无效,从而跳出while循环。
c中的输入输出函数
c++中也可以使用printf和scanf这些c中的输入输出函数,头文件为cstdio。
c中的大部分头文件都有对应的c++版本,头文件名字为c中的名字去掉.h并在最前面加c。