首页 > 编程笔记 > C++笔记 阅读:4

C++ std::cout输出语句的用法(非常详细)

在用户与计算机进行交互的过程中,数据输入与输出是必不可少的操作过程。计算机需要通过输入获取用户的操作指令,并通过输出显示操作结果。

C++中的流

C++ 中,数据的输入和输出发生在标准输入/输出设备(即键盘和显示器)、外部存储介质(即磁盘文件),以及内存空间之间。因此,对键盘和显示器的输入/输出简称“标准I/O”,对磁盘文件的输入/输出简称“文件I/O”,对内存空间的输入/输出简称“串I/O”。

C++ 把数据之间的这种传输操作称为“流”,意思是数据传输过程像水一样从一个地方流到另一个地方,实现输入的为输入流,实现输出的为输出流。

流既可以表示数据从内存传送到某个载体或设备中,也可以表示数据从某个载体或设备传送到内存缓冲区中。程序用流统一对各种计算机设备和文件进行操作,使程序与设备、文件无关,提高了程序设计的通用性和灵活性。

C++ 定义了 ios 基类,以及由其派生的输入流类 istream 和输出流类 ostream。标准 I/O 操作有 4 个类对象,分别是 cin、cout、cerr 和 clog:
当进行键盘输入操作时,使用 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 的对象,通过其中的成员函数可对数据进行格式化输出,如下表所示:

表 1 ostream 类的成员函数
成员函数 说明
flags(f) 当前格式状态全部替换为 f。其中,f 对应表 2-7 中的一种或多种格式
setf(f1, f2) 在当前格式的基础上,追加 f1 格式,并删除 f2 格式。其中,f2 可以省略
unsetf() 在当前格式的基础上,删除 f 格式
width(w) 设置数据的输出域宽为 w
fill(c) 当数据小于输出域宽时,用字符 c 填充空位(默认情况下用空格填充)
precision(n) 设置浮点数的输出精度为 n

表 2 格式化常量
格式 说明
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 表中的格式化常量非常相似,但可设置的格式更多。

表 3 C++格式控制符
格式控制符 作用
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

相关文章