C++ std::cout输出语句的用法(非常详细)
在用户与计算机进行交互的过程中,数据输入与输出是必不可少的操作过程。计算机需要通过输入获取用户的操作指令,并通过输出显示操作结果。
C++ 把数据之间的这种传输操作称为“流”,意思是数据传输过程像水一样从一个地方流到另一个地方,实现输入的为输入流,实现输出的为输出流。
流既可以表示数据从内存传送到某个载体或设备中,也可以表示数据从某个载体或设备传送到内存缓冲区中。程序用流统一对各种计算机设备和文件进行操作,使程序与设备、文件无关,提高了程序设计的通用性和灵活性。
C++ 定义了 ios 基类,以及由其派生的输入流类 istream 和输出流类 ostream。标准 I/O 操作有 4 个类对象,分别是 cin、cout、cerr 和 clog:
当进行键盘输入操作时,使用 cin 流;当进行显示器输出操作时,使用 cout 流;当进行错误信息输出操作时,使用 cerr 流或 clog 流。
C++ 数据流通过重载运算符“>>”和“<<”执行输入和输出操作。输出操作使用左移运算符“<<”向流中插入一个字符序列,输入操作使用右移运算符“>>”从流中提取一个字符序列。
先把 x 的值输出到显示器屏幕上,在当前屏幕光标位置显示出来,然后 cout 流恢复到等待输出的状态,以便继续通过插入操作输出下一个值。
当使用插入操作向一个流输出某个值后,再输出下一个值时将被放在上一个值的后面,所以为了让流中前后两个值分开,可以在输出一个值后接着输出一个空格,或一个换行符,或其他需要的字符或字符串。
一个 cout 语句可以分写成若干行。例如,下面的语句:
可以简单地写成多行:
也可写成多个 cout 语句:
这些成员函数使用时,前面要加上 cout 对象名,如:
另外,C++ 标准库提供的 iomanip.h 头文件中包含了大量的格式控制符,如下表所示,可以直接使用它们进行数据格式化输出,更加简单、快捷。仔细观察,读者会发现这些格式控制符和 2 表中的格式化常量非常相似,但可设置的格式更多。
【实例 1】定义一个整型变量并赋值,利用不同形式输出整型,具体代码如下:
【实例 2】定义两个整型变量,一个为十六进制整数,另一个为十进制整数。利用 cout 输出第一个变量的十进制、十六进制形式,第二个变量的小写十六进制和大写十六进制形式。代码如下:
【实例 3】定义一个整型变量并赋值,定义一个双精度变量并赋值,利用cout输出这两个不同精度的格式,具体代码如下:
【实例 4】定义两个单精度类型,用 cout 输出不同长度的小数,具体代码如下:
C++中的流
C++ 中,数据的输入和输出发生在标准输入/输出设备(即键盘和显示器)、外部存储介质(即磁盘文件),以及内存空间之间。因此,对键盘和显示器的输入/输出简称“标准I/O”,对磁盘文件的输入/输出简称“文件I/O”,对内存空间的输入/输出简称“串I/O”。C++ 把数据之间的这种传输操作称为“流”,意思是数据传输过程像水一样从一个地方流到另一个地方,实现输入的为输入流,实现输出的为输出流。
流既可以表示数据从内存传送到某个载体或设备中,也可以表示数据从某个载体或设备传送到内存缓冲区中。程序用流统一对各种计算机设备和文件进行操作,使程序与设备、文件无关,提高了程序设计的通用性和灵活性。
C++ 定义了 ios 基类,以及由其派生的输入流类 istream 和输出流类 ostream。标准 I/O 操作有 4 个类对象,分别是 cin、cout、cerr 和 clog:
- cin 代表标准输入设备(即键盘),也称 cin 流或标准输入流;
- cout 代表标准输出设备(即显示器),也称 cout 流或标准输出流。
当进行键盘输入操作时,使用 cin 流;当进行显示器输出操作时,使用 cout 流;当进行错误信息输出操作时,使用 cerr 流或 clog 流。
C++ 数据流通过重载运算符“>>”和“<<”执行输入和输出操作。输出操作使用左移运算符“<<”向流中插入一个字符序列,输入操作使用右移运算符“>>”从流中提取一个字符序列。
C++ cout输出语句
cout 语句的一般格式为:cout<<表达式1<<表达式2<<…<<表达式n;cout 代表显示器,执行 cout << x 操作就相当于把 x 的值输出到显示器。
先把 x 的值输出到显示器屏幕上,在当前屏幕光标位置显示出来,然后 cout 流恢复到等待输出的状态,以便继续通过插入操作输出下一个值。
当使用插入操作向一个流输出某个值后,再输出下一个值时将被放在上一个值的后面,所以为了让流中前后两个值分开,可以在输出一个值后接着输出一个空格,或一个换行符,或其他需要的字符或字符串。
一个 cout 语句可以分写成若干行。例如,下面的语句:
cout<< "Hello World!" <<endl;
可以简单地写成多行:
cout<< "Hello" // 注意行末尾无分号 << " " << "World!" << endl;
也可写成多个 cout 语句:
cout << "Hello"; // 语句末尾有分号 cout << " "; cout << "World!"; cout << endl;
C++ cout格式化输出
cout 是输出流类 ostream 的对象,通过其中的成员函数可对数据进行格式化输出,如下表所示:成员函数 | 说明 |
---|---|
flags(f) | 当前格式状态全部替换为 f。其中,f 对应表 2-7 中的一种或多种格式 |
setf(f1, f2) | 在当前格式的基础上,追加 f1 格式,并删除 f2 格式。其中,f2 可以省略 |
unsetf() | 在当前格式的基础上,删除 f 格式 |
width(w) | 设置数据的输出域宽为 w |
fill(c) | 当数据小于输出域宽时,用字符 c 填充空位(默认情况下用空格填充) |
precision(n) | 设置浮点数的输出精度为 n |
格式 | 说明 |
---|---|
ios::dec | 以十进制形式输出整数,此为默认的输出格式 |
ios::oct | 以八进制形式输出整数 |
ios::hex | 以十六进制形式输出整数 |
ios::fixed | 以普通小数形式(即定点格式)输出浮点数 |
ios::scientific | 以科学记数法形式输出浮点数 |
ios::left | 当数据小于输出域宽时,居左对齐,填充字符添加到右边 |
ios::right | 当数据小于输出域宽时,居右对齐,填充字符添加到左边 |
ios::internal | 数值的符号位在域宽内左对齐,数值右对齐,中间由填充字符填充 |
ios::showbase | 强制输出整数的基数,八进制数前显示 0,十六进制数前显示 0x |
ios::showpoint | 强制输出浮点数的小数点和尾数 0 |
ios::uppercase | 字母用大写表示。十六进制数中使用 A~E,前缀使用 0X,科学计数法使用 E |
ios::showpos | 在非负数值前显示 “+” |
ios::boolean | 把 true 和 false 输出为字符串(默认情况下为 1 和 0) |
ios::unitbuf | 输出后刷新所有的流 |
这些成员函数使用时,前面要加上 cout 对象名,如:
cout.setf(ios::left); cout.width(5);另外,可以同时设置多种格式,不同格式间用“|”连接。例如,数据输出时要求左对齐且字母大写,格式应为:
cout.setf(ios::left|ios::uppercase);
另外,C++ 标准库提供的 iomanip.h 头文件中包含了大量的格式控制符,如下表所示,可以直接使用它们进行数据格式化输出,更加简单、快捷。仔细观察,读者会发现这些格式控制符和 2 表中的格式化常量非常相似,但可设置的格式更多。
格式控制符 | 作用 |
---|---|
dec | 以十进制形式输出整数,此为默认设置 |
oct | 以八进制形式输出整数 |
hex | 以十六进制形式输出整数 |
fixed | 以普通小数形式输出浮点数 |
scientific | 以科学计数法形式输出浮点数 |
left | 当数据小于输出域宽时,居左对齐,填充字符添加到右边 |
right | 当数据小于输出域宽时,居右对齐,填充字符添加到左边。此为默认设置 |
setbase(b) | 设置整数的基数,即进制情况,b 可为 8、10 或 16 |
setw(w) | 设置输出域宽为 w,该设置仅影响下一次的 cout 输出 |
setfill(c) | 当数据小于输出域宽时,用字符 c 填充空位(默认用空格填充) |
setprecision(n) | 设置浮点数的输出精度为 n。在使用非 fixed 且非 scientific 格式时,n 即为有效数字最多的位数,如果有效数字位数大于 n,则小数部分四舍五入,或自动变为科学计数法输出,其保留 n 位有效数字。在使用 fixed 和 scientific 格式时,n 为小数点后面应保留的位数 |
setiosflags() | 在当前格式的基础上,追加格式 |
resetiosflags() | 在当前格式的基础上,删除格式 |
boolalpha | 把 true 和 false 输出为字符串,默认情况下为 1 和 0 |
showbase | 强制输出整数的基数,八进制数前显示 0,十六进制数前显示 0x |
showpoint | 总是输出小数点 |
showpos | 在非负数值前显示 “+” |
uppercase | 字母用大写表示。十六进制数中使用 A~E,前缀使用 0X,科学计数法使用 E |
internal | 数值的符号(正负号)在域宽内居左对齐,数值居右对齐,中间由字符填充 |
【实例 1】定义一个整型变量并赋值,利用不同形式输出整型,具体代码如下:
#include <iostream> #include <iomanip> using namespace std; int main() { int b=123456; cout << b << endl; // 输出 123456(十进制形式) cout << hex << b << endl; // 输出 1e240(十六进制形式) cout << setiosflags(ios::uppercase) << b << endl; // 输出 1E240(字母为大写) cout << setw(10) << b << ',' << b << endl; // 输出 1E240,1E240(第 1 次输出 b 时用空格填充空位) cout << setfill('*') << setw(10) << b << endl; // 输出*****1E240(用'*'填充空位) cout << setiosflags(ios::showpos) << b << endl; // 输出 1E240 }程序运行结果为:
123456 1e240 1E240 1E240,1E240 *****1E240 1E240
【实例 2】定义两个整型变量,一个为十六进制整数,另一个为十进制整数。利用 cout 输出第一个变量的十进制、十六进制形式,第二个变量的小写十六进制和大写十六进制形式。代码如下:
#include <iostream> #include <iomanip> using namespace std; int main() { int i=0x2F,j=255; cout << i << endl; // 输出 i 的十进制形式(默认格式) cout << hex << i << endl; // 输出 i 的十六进制形式 cout << hex << j << endl; // 输出 j 的十六进制形式 cout << hex << setiosflags(ios::uppercase) << j << endl; // 输出 j 的大写十六进制形式 }程序运行结果为:
47 2f ff FF
【实例 3】定义一个整型变量并赋值,定义一个双精度变量并赋值,利用cout输出这两个不同精度的格式,具体代码如下:
#include <iostream> using namespace std; int main() { int x=123; double y=-3.1415; cout << "x="; cout.width(10); // 设置输出域宽为 10 cout << x; cout << "y="; cout.width(10); // 设置输出域宽为 10 cout << y <<endl; cout.setf(ios::left); cout << "x="; cout.width(10); // 设置输出域宽为 10 cout << x; cout << "y="; cout.width(10); cout << y <<endl; cout.fill('*'); cout.precision(4); cout.setf(ios::showpos); cout << "x="; cout.width(10); // 设置输出域宽为 10 cout << x; cout << "y="; cout.width(10); // 设置输出域宽为 10 cout << y <<endl; }程序运行结果为:
x= 123y= -3.1415 x=123 y=-3.1415 x=+123******y=-3.142****
【实例 4】定义两个单精度类型,用 cout 输出不同长度的小数,具体代码如下:
#include <iostream> using namespace std; int main() { float x=20,y=-400.00; cout << x <<' '<< y << endl; // 直接输出 x 和 y cout.setf(ios::showpoint); cout << x <<' '<< y << endl; // 强制显示小数点和尾数 0 cout.unsetf(ios::showpoint); cout.setf(ios::scientific); cout << x <<' '<< y << endl; // 以科学计数法形式输出 cout.setf(ios::fixed); cout << x <<' '<< y << endl; // 以定点形式输出 }程序运行结果为:
20 -400 20.0000 -400.000 2.000000e+001 -4.000000e+002 20 -400