输入流与输出流的基本操作

cout语句一般格式为

cout << 表达式1 << 表达式2 << … <<表达式n;

cin语句一般格式为

cout >> 变量1 >> 变量2 >> … >>变量n;

在定义流对象时,系统会在内存中开辟一段缓冲区,用来暂存输入输出流的数据。在执行cout语句时,并不是插入一个数据就马上输出一个数据,而是先把插入的数据顺序存放在输出缓冲区中,直到输出缓冲区满或遇到cout 语句中的endl(或\n,endsflush)为止,此时将缓冲区中已有的数据一起输出,并清空缓冲区。系统提供的标准输出流中的数据向系统默认的设备(一般为显示器)输出。

一个cout 语句可以分写成若干行。比如:

cout << “This is a C++ program.” << endl;

同样也可以这样写:

1
2
3
4
cout << "This is"           //注意行末尾无分号
<< "a C++"
<< "program."
<< endl; //语句最后有分号

也可以写成多个cout语句,即:

1
2
3
4
cout << "This is";        //语句末尾有分号
cout << "a C++";
cout << "program.";
cout << endl;

由于前两个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
2
3
4
cin >> a            //注意行末尾无分号
>> b //这样写可能看起来清晰些
>> c
>>d;

也可以这样写

1
2
3
4
cin >> a;
cin >> b;
cin >> c;
cin >> d;

以上3种情况均可以从键盘输入:

1 2 3 4

也可以分多行输入数据:

1

2 3

4

在用cin输入时,系统也会根据变量的类型从输入流中提取相应长度的字节。如有

1
2
3
4
char c1,c2;
int a;
float b;
cin >> c1 >> c2 >> a >> b;

如果输入

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
2
3
4
5
6
7
8
double a = 123.456789012345;                              //对a赋初值
cout << a; //输出:123.456
cout<<setprecision(9)<<a; //输出:123.456789
cout<<setprecision(6); //恢复默认格式(精度为6)
cout<<setiosflags(ios::fixed); //输出:123.456789
cout<<setiosflags(ios::fixed)<<setprecision(8)<<a; //输出:123.45678901
cout<<setiosflags(ios::scientific)<<a; //输出:1.234568e+02
cout<<setiosflags(ios::scientific)<<setprecision(4)<<a; //输出:1.2346e02

第2行为按默认格式输出(以十进制小数形式输出,全部有效数字为6位)。第3行指定输出9位有效数字。第4行恢复默认格式,精度为6。第5行要求以固定小数位输出,默认输出6位小数。第6行指定输出8位小数。第7行指定按指数形式输出,默认给出6位小数(第7位小数四舍五入)。第6行以指数形式输出,指定4位小数。

下面是整数输出的例子:

1
2
3
4
5
6
7
int b = 123456;                        //对b赋初始值
cout << b; //输出:123456
cout<<hex<<b; //输出:1e240
cout<<setiosflags(ios::uppercase)<<b; //输出:1E240
cout<<setw(10)<<b<<','<<b; //输出:123456,123456
cout<<setfill('*')<<setw(10)<<b; //输出:****123456
cout<<setiosflags(ios::showpos)<<b; //输出:+123456

第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
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <iomanip>
using namespace std;int main()
{
double num1 = 123.456, num2 = 3.14159, num3 = -3214.16;
cout << setiosflags(ios::fixed) << setiosflags(ios::right) << setprecision(2);
cout << setw(10) << num1 << endl;
cout << setw(10) << num2 << endl;
cout << setw(10) << num3 << endl;
return 0;
}

运行结果

123.46        (字段宽度为10,右对齐,取两位小数)

       3.14

-3214.67

先统一设置定点形式输出、取两位小数,右对齐。这些设置对之后的输出均有效,除非重新设置而setw只对其后的一个输出项有效,因此必须在输出num1、num2、num3之前都要写setw(10)。


结束语

由于篇幅原因,有关C++中使用getchar和putchar进行字符的输入和输出等相关内容,将在下章呈现。快速跳转到下一篇文章C++学习笔记_第三章_第四节


To be continued……