C++学习笔记_第三章_第三节
输入流与输出流的基本操作
cout语句一般格式为
cout << 表达式1 << 表达式2 << … <<表达式n;
cin语句一般格式为
cout >> 变量1 >> 变量2 >> … >>变量n;
在定义流对象时,系统会在内存中开辟一段缓冲区,用来暂存输入输出流的数据。在执行cout语句时,并不是插入一个数据就马上输出一个数据,而是先把插入的数据顺序存放在输出缓冲区中,直到输出缓冲区满或遇到cout 语句中的endl
(或\n
,ends
,flush
)为止,此时将缓冲区中已有的数据一起输出,并清空缓冲区。系统提供的标准输出流中的数据向系统默认的设备(一般为显示器)输出。
一个cout 语句可以分写成若干行。比如:
cout << “This is a C++ program.” << endl;
同样也可以这样写:
1 | cout << "This is" //注意行末尾无分号 |
也可以写成多个cout语句,即:
1 | cout << "This is"; //语句末尾有分号 |
由于前两个cout语句中的字符串最后没有换行符,因此下一行的字符紧接着上一行的末尾输出。
以上3种情况的输出均为:
This is a C++ program.
注意:不能用一个插入运算符“<<”插入多个输出项,如下面写法是错误的:
cout << a,b,c; //错误,不能一次插入多项
但是
cout << a + b + c; //正确,这是一个表达式,作为一个输出项则是正确的
在用cout输出时,用户不必通知计算机按何种类型输出,系统会自动判别输出数据的类型,使输出的数据按相应的类型输出。如已定义a为int型,b为float型,c为char型,则
cout << a <<’ ‘<< b <<’ ‘<< c << endl; //a=4 b=345.789 c=a
会以下面的形式输出:
4 345.789 a
与cout类似,一个cin语句可以分写成若干行。比如:
cin >> a >> b >> C >> d;
还可以这样写
1 | cin >> a //注意行末尾无分号 |
也可以这样写
1 | cin >> a; |
以上3种情况均可以从键盘输入:
1 2 3 4
也可以分多行输入数据:
1
2 3
4
在用cin输入时,系统也会根据变量的类型从输入流中提取相应长度的字节。如有
1 | char c1,c2; |
如果输入
1234 56.78
系统会取第1个字符“1”给字符变量c1,取第2个字符“2”给字符变量c2,再取34给整型变量a,最后取56.78给实型变量b。注意:34后面应该有空格以便和56.78分隔开。也可按下面格式输入:
1 2 34 56.78 (在1和2中间有空格)
在从输入流中提取了字符“1”送给c1后,遇到第2个字符,是一个空格,系统把空格作为数据间的分隔符,不予提取而提取后面一个字符“2”送给c2,然后再分别提取34和56.78给a和b。由此可知:不能用cin语句把空格字符和回车换行符作为字符输入给字符变量,它们将被跳过。如果想将空格字符或回车换行符(或任何其他键盘上的字符)输入给字符变量,可以后面介绍的介绍的getchar函数。
在组织输入流数据时,要仔细分析cin语句中变量的类型,按照相应的格式输入,否则容易出错。
在标准输入流与输出流中使用控制符(操纵符)
如上介绍到使用cin和cout时的默认格式。但有时候人们输入输出时有一些特殊的要求,如在输出实数时规定字段宽度,只保留两位小数,数据向左或向右对齐等。C++提供了在标准输入输出流中的控制符(操纵符),见下表:
控制符(操纵符) | 作用 |
---|---|
dec | 设置数值的基数为10 |
hex | 设置数值的基数为16 |
oct | 设置数值的基数为8 |
setfill(c) | 设置填充字符c,c可以是字符常量或字符变量 |
setprecision(n) | 设置浮点数的精度为n位。在以一般十进制小数形式输出时,n代表有效数字。在fixed(固定小数位数)形式和scientific(指数)形式输出时,n为小数位数 |
setw(n) | 设置字段宽度为n位 |
setiosflags(ios::fixed) | 设置浮点数以固定的小数位数显示 |
setiosflags(ios::scientific) | 设置浮点数以科学计数发(即指数形式)显示 |
setiosflags(ios::left) | 输出数据左对齐 |
setiosflags(ios::right) | 输出数据右对齐 |
setiosflags(ios::skipws) | 忽略前导的空格 |
setiosflags(ios::uppercase) | 数据以十六进制形式输出时字母以大写表示 |
setiosflags(ios::lowercase) | 数据以十六进制输出时字母以小写表示 |
setiosflags(ios::showpos) | 输出正数时给出“+”号 |
需要注意的是,如果使用了控制符,在程序单位开头除了要加iostream头文件外,还要加iomanip头文件。
各位读者可能对上面的控制符表示方式不习惯,对其作用记不住。其实从英文字面上看,是很好理解并容易记住的。例如setfill,其中set是“设置”,fill是“填充”,setprecision中的precision是“精度”的意思。setw中的w是“宽度”(width的缩写),setiosflags中的ios是iostream(输入输出流)的缩写,flags的含义是“标志”,fixed是“固定的”,scientific是“科学的(计数法)“,showpos是show positive(显示正号)等。
例:输出双精度数。
1 | double a = 123.456789012345; //对a赋初值 |
第2行为按默认格式输出(以十进制小数形式输出,全部有效数字为6位)。第3行指定输出9位有效数字。第4行恢复默认格式,精度为6。第5行要求以固定小数位输出,默认输出6位小数。第6行指定输出8位小数。第7行指定按指数形式输出,默认给出6位小数(第7位小数四舍五入)。第6行以指数形式输出,指定4位小数。
下面是整数输出的例子:
1 | int b = 123456; //对b赋初始值 |
第2行按十进制整数形式输出。第3行按十六进制整数形式输出,其中字母“e”代表十六进制中的14。第4行按十六进制形式输出,字母e改为大写。第5行指定字段宽为10,在123456前留4个空格。紧接着再输出一次b,但由于setw 只对其后第1个数据起作用,因此在输出第2个b时setw(10)不起作用,按默认方式输出,前面不留空格。第6行在输出时用'*'代替空格。第7行在正数前面加一个“+”号。
如果在多个cout语句中使用相同的setw(n)
,并使用setiosflags(ios::right)
,可以实 现各行数据右对齐,如果指定相同的精度,可以实现上下小数点对齐。
例:使各行小数点对齐。
编写程序:
1 |
|
运行结果
123.46 (字段宽度为10,右对齐,取两位小数)
3.14
-3214.67
先统一设置定点形式输出、取两位小数,右对齐。这些设置对之后的输出均有效,除非重新设置,而setw只对其后的一个输出项有效,因此必须在输出num1、num2、num3之前都要写setw(10)。
结束语
由于篇幅原因,有关C++中使用getchar和putchar进行字符的输入和输出等相关内容,将在下章呈现。快速跳转到下一篇文章C++学习笔记_第三章_第四节