iostream库

  • iostream库包含两个基础类型istream和ostream,分别表示输入流和输出流
  • 一个流就是一个字符序列,是从IO设备读出或写入IO设备的
  • 流想要表达的是,随着时间的推移,字符是顺序生成或消耗的

标准输入输出对象

  • 标准库定义了四个IO对象
  • 名为cin的istream类型对象,也称为标准输入对象
  • 名为cout的ostream类型对象,也称为标准输出对象
  • 名为cerr的ostream类型对象,通常用来输出警告和错误信息,也被称为标准错误
  • 名为clog的ostream类型对象,用来输出程序运行时的一般性信息。

向流写入数据

#include<iostream>
int main(){
	std::cout<<"Enter two numbers:"<<std::endl;
	int v1=0,v2=0;
	std::cin>>v1>>v2;
	std::cout<<"The sum of"<<v1<<"and"<<v2
			 <<"is"<<v1+v2<<std::endl;
	return 0;
}
  • main函数的第一条语句执行了一个表达式。在C++中,一个表达式产生一个计算结果,它由一个或多个运算对象和(通常是)一个运算符组成。这条语句中的表达式使用了输出运算符<<在标准输出上打印消息。
  • <<运算符接受两个运算对象,左侧的运算对象必需是一个ostream对象,右侧的运算对象是要打印的值。此运算符将给定的值写道给定的ostream对象中。输出运算符的计算结果就是其左侧运算对象,即计算结果就是写入给定值的那个ostream对象。
  • 输出语句使用了两次<<运算符。此运算符返回其左侧的运算对象,第一个运算符的结果成了第二个运算符的左侧运算对象。因此,可以将输出请求连接起来。
  • 链中每个运算符的左侧运算对象都是相同的,在上例中是std::cout,也可以用两条语句生成相同的输出。
std::cout<<"Enter two numbers:";
syd::cout<<std::endl;
  • 第一个输出运算符给用户打印一条消息。这个消息是一个字符串字面值常量,是用一对双引号包围的字符串序列,在双引号之间的文本被打印到标准输出。
  • 第二个输出运算符打印endl,这是一个被称为操纵符的特殊值。写入endl的效果是结束当前行,并将与设备关联的缓冲区中的内容刷到设备中。缓冲刷新操作可以保证到目前为止程序所产生的所有输出都真正写入输出流中,而不是仅仅停留在内存中等待写入流。

程序员常在调试时添加打印语句。这类语句应该保证“一直”刷新流。否则,如果程序崩溃,输出可能还停留在缓冲区中,从而导致关于程序崩溃位置的错误推断。

使用标准库中的名字

  • 前缀std::指出名字cout和endl是定义在名为std的命名空间中的。
  • 命名空间有助于避免不经意的名字定义冲突,以及使用库中相同的名字导致的冲突。标准库定义的所有名字都在命名空间std中。

从流中读取数据

  • 输入运算符>>与输出运算符类似,它接受一个istream作为其左侧运算对象,接受一个对象作为其右侧运算对象。它从给定的istream读入数据,并存入给定对象中。
  • 与输出运算符类似,输入运算符返回其左侧运算对象作为其计算结果。因此,可以将一系列输入请求合并到单一语句中。

读取数量不定的输入数据

int sum=0, value=0;
while(std::cin>>value)
	sum+=value;
  • 当使用一个istream对象作为条件时,其结果是检测流的状态。如果流是有效的,即未遇到错误,那么检测成功。当遇到文件结束符,或遇到一个无效输入时(例如读入的值不是一个整数),istream对象的状态会变为无效,此时该判断使循环结束。

相关术语

  • 缓冲区:一个存储区域,用于保存数据。IO设施通常将输入(或输出)数据保存在一个缓冲区中,读写缓冲区的动作与程序中的动作是无关的。可以显式的刷新输出缓冲,以便强制将缓冲区中的数据写入输出设备。默认情况下,读cin会刷新cout;程序非正常终止时也会刷新cout。
  • cerr:一个ostream对象,关联到标准错误,通常写入到与标准输出相同的设备。默认情况下,写道cerr的数据是不缓冲的。cerr通常用于输出错误信息或其它不属于程序正常逻辑的输出内容。
  • clog:一个ostream对象,关联到标准错误。默认情况下,写到clog的数据是被缓冲的。clog通常用于报告程序的执行信息,存入一个日志文件中。
  • iostream头文件:提供了面向流的输入输出的标准库类型。
  • 操纵符:对象,如std::endl,在读写流的时候用来“操纵”流本身。
  • 命名空间:将库定义的名字放在一个单一位置的机制。命名空间可以帮助避免不经意的名字冲突。c++标准库定义的名字在命名空间std中。
  • 标准错误:输出流,用于报告错误。标准输出和标准错误通常关联到程序执行所在的窗口。
  • 标准输入:输入流,通常与程序执行所在窗口相关联。
  • 标准输出:输出流,通常与程序执行所在窗口相关联。
  • 标准库:一个类型和函数的集合,每个c++编译器都必需支持。标准库提供了支持IO操作的类型。c++程序员倾向于用“库”指代整个标准库,还倾向于用库类型表示标准库的特定部分,例如用“iostream库”表示标准库中定义IO类的部分。
  • ::运算符:作用域运算符。用处之一是访问命名空间中的名字。如,std::cout表示命名空间std中的名字cout。