C++ 标准输入输出
开始之前,我们先来说说水管,对,就是家里接水的水管,比如下水道的水管啦,热水器的水管啦
在没有热水器之前,我们怎么洗澡呢?就是拿着一个桶,装满水,然后洗啊洗,洗到一半半的时候就要再去拎一桶水,很不方便啊,尤其是冬天。有了热水器,我们只要打开开关,喷头里的水就会自动流出来了,而且源源不绝
它们有什么区别呢? 就是打洗澡水的方式,一个是一遍一遍的去拎,一个是只要打开开关,就会自己流出来
这跟我们编程有啥关联呢?
C++
把用户输入的数据和要输出的数据封装成一个流 (stream), 就像热水管里的水一样,长长的,连绵不绝的
C++
中的流是字节序列。如果字节流是从设备 ( 如键盘、磁盘驱动器、网络连接等 ) 流向内存,这叫做 输入操作
如果字节流是从内存流向设备 ( 如显示屏、打印机、磁盘驱动器、网络连接等 ) 叫做 输出操作
C++ I/O 库头文件
C++ 提供了三个头文件用于处理 I/O
头文件 | 描述 |
---|---|
<iostream> | 定义了 cin 、cout 、cerr 和 clog 对象,分别对应于标准输入流、标准输出流、非缓冲标准错误流和缓冲标准错误流 |
<iomanip> | 通过所谓的参数化的流操纵器 ( 比如 setw 和setprecision ) ,来声明对执行标准化 I/O 有用的服务 |
<fstream> | 为用户控制的文件处理声明服务 |
标准输出流 ( cout )
预定义对象 cout
"连接" 到标准输出设备,通常是显示屏
cout
定义在命名空间 std
当中,所以一般的使用方法是 std:cout
std::cout 一般与流插入运算符 <<
一起使用
#include <iostream> int main( ) { std::cout << "Hello www.twle.cn "; return 0; }
使用 g++ main.cpp && ./a.out
命令编译和运行代码,输出结果如下
Hello www.twle.cn
标准输入流 ( cin )
预定义对象 cin 是 "连接" 到标准输入设备,通常是键盘
cin
定义在命名空间 std
当中,所以一般的使用方法是 std:cout
std::cin
一般与流提取运算符 >>
一起使用,意思是提取标准输入(std:cin
)里的数据
#include <iostream> int main( ) { char name[128]; std::cout << "请输入一段英文"; std::cin >> name; std::cout << "你输入的数据为:" << name << std::endl; return 0; }
使用 g++ main.cpp && ./a.out
命令编译和运行代码,它会提示用户输入名称。当用户输入一个值,并按回车键,就会看到下列结果:
请输入一段英文www.twle.cn 你输入的数据为:www.twle.cn
流提取运算符 >>
在一个语句中可以多次使用,如果要求输入多个数据,可以使用如下语句:
cin >> name >> age;
相当于下面两个语句
cin >> name; cin >> age;
标准错误流(cerr)
预定义的对象 cerr "连接** 到标准错误设备,通常也是显示屏
cerr
对象是非缓冲的,且每个流插入到 cerr
都会立即输出
cerr
定义在命名空间 std
当中,所以一般的使用方法是 std:cerr
std::cerr
一般与流插入运算符 <<
一起使用,意思是将流里的数据插入到标准错误输出(std:cerr
)
#include <iostream> int main( ) { std::cerr << "发生错误了啊" << std::endl; return 0; }
使用 g++ main.cpp && ./a.out
命令编译和运行代码,输出结果如下
发生错误了啊
标准日志流 ( clog )
预定义的对象 clog "连接" 到标准错误设备,通常也是显示屏
clog
对象是缓冲的,每个流插入到 clog
都会先存储在缓冲区,直到缓冲填满或者缓冲区刷新时才会输出
clog
定义在命名空间 std
当中,所以一般的使用方法是 std:clog
std::clog
一般与流插入运算符 <<
一起使用,意思是将流里的数据插入到标准日志流(std:clog
)
#include <iostream> int main( ) { std::clog << "Error message : Unable to read...\n"; return 0; }
使用 g++ main.cpp && ./a.out
命令编译和运行代码,输出结果如下
Error message : Unable to read...
最佳实战
一般情况下,是我们无法区分 cout
、cerr
和 clog
的差异
但在编写复杂的程序的时候,它们之间的差异就变得非常明显
一般情况下,使用 cerr
流来显示错误消息,而其它的日志消息则使用 clog
流来输出