当前位置:首页 > 编程技术 > 正文内容

C++输出格式化:从流输出到控制台

yc8881年前 (2023-08-24)编程技术278

一、格式化输出的作用

C++输出格式化:从流输出到控制台

在C++中,格式化输出是指以一定的格式向控制台输出信息。相比于普通输出,格式化输出能够使输出信息更加直观和易读。比如可以将输出的数字、字符串、日期等按照一定格式进行排版,以便用户更好地理解信息。

大多数情况下,格式化输出是用于向用户展示计算的结果。例如,在计算器应用中,结果需要用规范的形式呈现给用户。在游戏开发中,我们需要向玩家提供游戏状态的输出,以便他们更好地理解和玩游戏。在数据分析领域,我们需要将处理后的数据以可读性更高的方式输出,以便数据分析师进一步分析其中的规律。

C++语言提供了强大的输出库,可以以多种方式对输出进行格式化。主要包括流输出、printf()和format()等方式。本篇文章主要介绍C++流输出的方式。

二、C++流输出的基本语法

C++中流输出的语法比较简单。流输出运算符“<<”用于将需要输出的元素拼接到一起。例如:

#include <iostream>
using namespace std;

int main() {
  int a = 10;
  cout << "hello" << "world" << a << endl;
  return 0;
}

以上代码会将“hello”,“world”和变量a的值拼接成一个字符串然后输出,输出结果为:“helloworld10”。通过“<<”运算符将多个元素拼接为一个字符串,不同类型的元素可以并列使用,编译器会自动将它们转换为字符串。

流输出默认以空格符为分隔符,默认以换行符结尾。通过符号“endl”可以手动输入回车符。例如:

#include <iostream>
using namespace std;

int main() {
  cout << "hello" << endl;
  cout << "world" << endl;
  return 0;
}

以上代码会将“hello”与“world”分别输出并在每个字符串结尾输入换行符。

三、C++流输出的格式化

在实际使用中,通常需要进行更加复杂的格式化操作,包括输出宽度、刷空格、输出小数、设置精度等。C++流输出提供了丰富的选项,可以实现各种复杂的输出需求。

3.1 输出宽度和填充字符

在输出一个字符串或数字时,我们往往需要控制输出场宽和填充字符。C++流输出提供了 setw() 函数来设置输出的宽度,fill() 函数来设置填充字符。例如,如果我们想要输出一个数字,并让它至少占 6 个字符宽度,可以采用如下方式:

#include<iostream>
#include<iomanip> // 必须 include <iomanip> 头文件才能使用 setw() 函数
using namespace std;

int main() {
    int num = 10;
    cout << "|" << setw(6) << num << "|" << endl;
    return 0;
}

输出结果:

| 10| 其中setw(6)指定了num所在输出项的宽度为6个字符,左边不足的补充空格。

类似地,如果我们希望输出将左对齐的字符串,可以如下设置:

#include<iostream>
#include<iomanip> // 必须 include <iomanip> 头文件才能使用 setw() 函数
using namespace std;

int main() {
    string s = "hello";
    cout << "|" << setw(10) << left << s << "|" << endl;
    return 0;
}

输出结果: |hello | 其中left指定将字符串左对齐输出,剩余字符用空格填充。

3.2 输出小数

在C++中,输出小数需要使用到 float、double 和 long double 等类型。小数的输出可以通过控制符“fixed”和“scientific”进行控制。

例如,如果我们想要以科学计数法形式输出一个十进制小数,可以使用如下代码:

#include<iostream>
#include<iomanip> // 必须 include <iomanip> 头文件才能使用 setprecision() 函数
using namespace std;

int main() {
    double num = 1000.0 / 3.0;
    cout << scientific << setprecision(10) << num << endl;
    return 0;
}

输出结果: 3.3333333333e+002

在上面的代码中,setprecision() 函数设置输出精度到小数点后面的位数,scientific用于控制输出结果是科学计数法。

3.3 输出控制符

C++流输出支持不同的控制符,用于控制输出格式,如oct、dec、hex、left、right、flush等等。

下面是一些常用的控制符:

  • boolalpha:true输出为“true”,false输出为“false”

  • uppercase:输出字母时强制大写

  • showbase:在输出时显示基数

  • oct:以八进制输出

  • dec:以十进制输出

  • hex:以十六进制输出

  • left:左对齐输出

  • right:右对齐输出

  • setw():设置输出场宽

  • setprecision():设置输出精度

  • flush:刷新缓存区

3.4 流输出和文件输出

在C++中,我们可以将输出重定向到文件中,这意味着我们可以将格式化后的输出保存到文件中,而不是输出到控制台。C++提供了两种方式将输出重定向到文件中,分别为流输出和文件输出。

对于流输出,我们可以将输出重定向到字符串缓存中,然后将其保存至文件中。流输出到字符串缓存的核心是stringstream库。

例如,我们可以通过如下代码将输出重定向到字符串中:

#include<iostream>
#include<fstream>
#include<sstream>
using namespace std;

int main(){
    //将 cout 重定向到 buffer
    stringstream buffer;
    cout.rdbuf(buffer.rdbuf());
    //执行输出操作
    cout<<"hello, world!"<

在上面的代码中,我们使用 cout.rdbuf() 将输出流重定向到字符串缓存中,执行后打印出“hello, world!”。接着,在代码中使用了 buffer.str() 方法从字符串缓存中读出输出,并将其保存到文件中。

类似地,C++中还可以通过文件输出流重定向输出到文件中。例如:

#include<iostream>
#include<fstream>
using namespace std;

int main(){
    //将 cout 输出重定向到文件
    ofstream outfile("output.txt");
    streambuf* old_cout_buf = cout.rdbuf(); //保存 cout 原有的 buf 指针
    cout.rdbuf(outfile.rdbuf()); //将 cout 的 buf 指向 outfile 的 buf 指针
    //执行输出操作
    cout<<"hello, file!"<

以上程序会向当前目录下的 output.txt 文件写入一行文本“hello, file!”。

四、总结

本文主要介绍了C++流输出的基本语法、格式化等操作。有了这些基本操作的掌握,我们可以更好地控制输出信息的形式和布局,为用户提供更好的使用体验。

总之,格式化输出不仅可以使程序具有更好的可读性和易用性,还可以为用户提供更直观和良好的用户体验。C++流输出是实现格式化输出的重要手段之一,掌握其基本语法和格式化操作,能够使我们的程序能够更好地满足用户需求。


本站发布的内容若侵犯到您的权益,请邮件联系站长删除,我们将及时处理!


从您进入本站开始,已表示您已同意接受本站【免责声明】中的一切条款!


本站大部分下载资源收集于网络,不保证其完整性以及安全性,请下载后自行研究。


本站资源仅供学习和交流使用,版权归原作者所有,请勿商业运营、违法使用和传播!请在下载后24小时之内自觉删除。


若作商业用途,请购买正版,由于未及时购买和付费发生的侵权行为,使用者自行承担,概与本站无关。


本文链接:https://www.10zhan.com/biancheng/10708.html

标签: C++
分享给朋友:

“C++输出格式化:从流输出到控制台” 的相关文章

【说站】Thymeleaf报错Error resolving template “XXX”

【说站】Thymeleaf报错Error resolving template “XXX”

修改了一下开源项目的目录结构访问突然报错Error resolving template “XXX”可能原因有如下三种:第一种可能:原因:在使用springboot的过程中,如果使用thymeleaf...

【说站】用一句话就可以去除宝塔面板操作上的二次验证

【说站】用一句话就可以去除宝塔面板操作上的二次验证

用过宝塔的朋友应该都会发现,现在宝塔面板有些鸡肋的功能,删除文件、删除数据库、删除站点等操作都需要做计算题!不仅加了几秒的延时等待,还无法跳过!这时候就会有朋友在想,如何去除宝塔面板的二次验证,此篇文...

【说站】Centos8.0如何配置静态IP详解及永久关闭防火墙

【说站】Centos8.0如何配置静态IP详解及永久关闭防火墙

这篇文章主要介绍了详解Centos8 配置静态IP的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来学习一下!1. 查看自己的网关地址点击虚...

【说站】利用Webhook实现Java项目自动化部署

【说站】利用Webhook实现Java项目自动化部署

用webhook就能实现Java项目自动部署,其实原理很简单。费话不多说,直接往下看教程。1. 创建gitee仓库并初始化2. 在linux安装git3. 在宝塔的软件的商店里下载Webhook4....

【说站】电脑安装MySQL时出现starting the server失败原因及解决方案

【说站】电脑安装MySQL时出现starting the server失败原因及解决方案

今天在安装MySQL时出现starting the server失败,经过查询分析得出以下结论,记录一下操作步骤。原因分析:如果电脑是第一次安装MySQL,一般不会出现这样的报错。如下图所示。star...

【说站】linux中redis如何以redis用户重启?

【说站】linux中redis如何以redis用户重启?

通过上图我们可以看到,目前状态是已经以 redis 用户启动着,我想修改下 redis 的密码,然后怎么以 redis 用户重启呢?redis 是 nologin 用户,不能通过 su redis 切...