格式化输入输出【专辑优质版】

一、引言

在 C++ 编程中,输入输出操作是程序与外部世界进行交互的重要方式。有效的输入输出可以使程序更加用户友好、易于调试和使用。C++ 提供了丰富的输入输出功能,包括格式化输入输出,允许程序员以特定的格式控制数据的输入和输出。本文将深入探讨 C++ 中的格式化输入输出,包括其基本概念、用法、各种格式化选项以及实际应用。

二、C++ 输入输出概述

(一)输入输出流的概念
在 C++ 中,输入输出操作是通过流来实现的。流可以看作是数据的通道,数据在流中流动。输入流用于从外部源(如键盘、文件等)读取数据,而输出流用于向外部目标(如屏幕、文件等)写入数据。

(二)标准输入输出流
C++ 提供了三个标准输入输出流对象:cincoutcerrcin是标准输入流,用于从键盘读取数据。cout是标准输出流,用于向屏幕输出数据。cerr是标准错误流,用于输出错误信息。

三、格式化输出

(一)使用cout进行格式化输出

  1. 基本用法
    cout可以通过插入运算符<<来输出各种数据类型的值。例如:

cpp

Copy

int num = 10;
cout << "The number is: " << num << endl;

  1. 控制输出格式
    可以使用操纵符来控制输出的格式。例如,使用setw操纵符可以设置输出字段的宽度,使用setprecision操纵符可以设置浮点数的精度。

cpp

Copy

#include <iostream>
#include <iomanip>int main() {int num = 123;cout << "Number: " << setw(5) << num << endl;double pi = 3.1415926535;cout << "Pi: " << setprecision(4) << pi << endl;return 0;
}

(二)格式标志
C++ 中的输出流可以设置各种格式标志来控制输出的格式。格式标志可以通过ios_base类的成员函数来设置和清除。

  1. 进制标志
    可以使用dechexoct标志来设置输出的进制。例如:

cpp

Copy

int num = 10;
cout << "Decimal: " << dec << num << endl;
cout << "Hexadecimal: " << hex << num << endl;
cout << "Octal: " << oct << num << endl;

  1. 浮点数标志
    可以使用fixedscientific标志来设置浮点数的输出格式。fixed标志以固定小数点的形式输出浮点数,scientific标志以科学计数法的形式输出浮点数。

cpp

Copy

double pi = 3.1415926535;
cout << "Fixed: " << fixed << pi << endl;
cout << "Scientific: " << scientific << pi << endl;

(三)自定义格式输出
除了使用内置的操纵符和格式标志外,还可以通过自定义操纵符来实现特定的输出格式。自定义操纵符可以通过重载operator<<函数来实现。

cpp

Copy

#include <iostream>
#include <iomanip>class CustomManipulator {
public:void operator()(std::ostream& os) const {os << "Custom format";}
};std::ostream& operator<<(std::ostream& os, const CustomManipulator& manip) {manip(os);return os;
}int main() {cout << CustomManipulator() << endl;return 0;
}

四、格式化输入

(一)使用cin进行格式化输入

  1. 基本用法
    cin可以通过提取运算符>>来从输入流中读取各种数据类型的值。例如:

cpp

Copy

int num;
cout << "Enter a number: ";
cin >> num;
cout << "You entered: " << num << endl;

  1. 输入格式控制
    可以使用操纵符来控制输入的格式。例如,使用skipws操纵符可以忽略输入中的空白字符,使用noskipws操纵符可以不忽略输入中的空白字符。

cpp

Copy

#include <iostream>
#include <iomanip>int main() {char ch;cout << "Enter a character: ";cin >> noskipws >> ch;cout << "You entered: " << ch << endl;return 0;
}

(二)输入验证
在进行输入操作时,需要进行输入验证,以确保输入的数据符合要求。可以使用循环和条件语句来实现输入验证。

cpp

Copy

#include <iostream>int main() {int num;cout << "Enter a positive number: ";while (!(cin >> num) || num <= 0) {cin.clear();cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');cout << "Invalid input. Please enter a positive number: ";}cout << "You entered: " << num << endl;return 0;
}

五、文件输入输出的格式化

(一)文件输出流
可以使用ofstream类来创建文件输出流,向文件中写入数据。文件输出流的格式化操作与标准输出流类似,可以使用操纵符和格式标志来控制输出的格式。

cpp

Copy

#include <iostream>
#include <fstream>
#include <iomanip>int main() {std::ofstream outfile("output.txt");if (outfile.is_open()) {int num = 123;outfile << "Number: " << setw(5) << num << endl;double pi = 3.1415926535;outfile << "Pi: " << setprecision(4) << fixed << pi << endl;outfile.close();} else {std::cerr << "Unable to open file for writing." << endl;}return 0;
}

(二)文件输入流
可以使用ifstream类来创建文件输入流,从文件中读取数据。文件输入流的格式化操作与标准输入流类似,可以使用操纵符和格式标志来控制输入的格式。

cpp

Copy

#include <iostream>
#include <fstream>
#include <iomanip>int main() {std::ifstream infile("input.txt");if (infile.is_open()) {int num;infile >> num;std::cout << "Number from file: " << num << endl;double pi;infile >> pi;std::cout << "Pi from file: " << setprecision(4) << fixed << pi << endl;infile.close();} else {std::cerr << "Unable to open file for reading." << endl;}return 0;
}

六、字符串输入输出的格式化

(一)字符串输出流
可以使用ostringstream类来创建字符串输出流,将数据写入到字符串中。字符串输出流的格式化操作与标准输出流类似,可以使用操纵符和格式标志来控制输出的格式。

cpp

Copy

#include <iostream>
#include <sstream>
#include <iomanip>int main() {std::ostringstream oss;int num = 123;oss << "Number: " << setw(5) << num << endl;double pi = 3.1415926535;oss << "Pi: " << setprecision(4) << fixed << pi << endl;std::string str = oss.str();std::cout << str << endl;return 0;
}

(二)字符串输入流
可以使用istringstream类来创建字符串输入流,从字符串中读取数据。字符串输入流的格式化操作与标准输入流类似,可以使用操纵符和格式标志来控制输入的格式。

cpp

Copy

#include <iostream>
#include <sstream>
#include <iomanip>int main() {std::istringstream iss("123 3.1415926535");int num;iss >> num;std::cout << "Number from string: " << num << endl;double pi;iss >> pi;std::cout << "Pi from string: " << setprecision(4) << fixed << pi << endl;return 0;
}

七、格式化输入输出的高级应用

(一)输出到多个流
可以使用流的链式操作将数据输出到多个流中。例如,可以同时将数据输出到屏幕和文件中。

cpp

Copy

#include <iostream>
#include <fstream>int main() {std::ofstream outfile("output.txt");if (outfile.is_open()) {std::cout << "Output to screen and file." << std::endl;std::cout << "Number: 123" << std::endl;outfile << "Number: 123" << std::endl;outfile.close();} else {std::cerr << "Unable to open file for writing." << std::endl;}return 0;
}

(二)自定义输入输出操作符
可以通过重载输入输出操作符来实现自定义类型的输入输出。例如,可以为自定义的类重载operator<<operator>>函数,实现对自定义类型的格式化输入输出。

cpp

Copy

#include <iostream>class MyClass {
public:int value;MyClass(int v) : value(v) {}
};std::ostream& operator<<(std::ostream& os, const MyClass& obj) {os << "MyClass value: " << obj.value;return os;
}std::istream& operator>>(std::istream& is, MyClass& obj) {is >> obj.value;return is;
}int main() {MyClass obj(123);std::cout << obj << std::endl;MyClass obj2;std::cout << "Enter a value for MyClass: ";std::cin >> obj2;std::cout << obj2 << std::endl;return 0;
}

八、性能考虑

在进行格式化输入输出时,需要考虑性能问题。频繁的格式化操作可能会影响程序的性能。以下是一些提高性能的建议:

(一)避免不必要的格式化操作
在不需要特定格式的情况下,尽量避免使用格式化操作。例如,如果只需要输出一个整数,可以直接使用cout << num;而不是cout << "Number: " << setw(5) << num << endl;

(二)批量输出
如果需要输出大量的数据,可以考虑将数据存储在一个容器中,然后一次性输出整个容器,而不是逐个输出每个元素。这样可以减少格式化操作的次数,提高性能。

(三)使用缓冲区
输入输出操作通常涉及到与外部设备的交互,这可能会比较耗时。可以使用缓冲区来减少与外部设备的交互次数,提高性能。C++ 的输入输出流默认使用缓冲区,可以通过设置缓冲区的大小和刷新策略来进一步优化性能。

九、错误处理

在进行格式化输入输出时,可能会出现各种错误。以下是一些常见的错误及处理方法:

(一)输入错误
如果输入的数据与预期的格式不匹配,cin会进入错误状态。可以使用cin.clear()cin.ignore()函数来清除错误状态并忽略错误的输入。

(二)文件打开错误
如果无法打开文件进行输入输出,会抛出一个异常。可以使用try-catch块来捕获异常并进行相应的处理。

(三)输出错误
如果输出操作失败,例如无法写入到文件或屏幕,可以检查输出流的状态标志来确定错误的原因。可以使用ios_base::failbitios_base::badbit标志来检测输出错误。

十、总结

C++ 的格式化输入输出提供了强大的功能,可以控制数据的输入和输出格式。通过使用操纵符、格式标志和自定义操作符,可以实现各种复杂的输入输出需求。在进行格式化输入输出时,需要考虑性能和错误处理,以确保程序的稳定性和可靠性。通过深入理解和灵活运用 C++ 的格式化输入输出功能,可以编写出更加高效、用户友好的程序。

总之,C++ 的格式化输入输出是 C++ 编程中不可或缺的一部分。掌握了这些知识,程序员可以更好地控制程序的输入输出,提高程序的可读性和可维护性。同时,在实际应用中,还需要根据具体的需求选择合适的格式化方法,并注意性能和错误处理,以确保程序的高效运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/476541.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高中-信息技术科目考试-编程题

&#xff08;24上&#xff09;1.为了响应国家低碳的倡议&#xff0c;学校请你设计一个饮料瓶回收系统&#xff0c;根据投的饮料瓶类型和数量进行奖励。具体如下图&#xff1a;假设学生投瓶10个&#xff0c;投瓶类型定义为t&#xff08;0表示塑料瓶&#xff0c;1表示易拉罐&…

如何将文件Copy到Docker镜像中

如何将文件Copy到Docker镜像中 一、使用Dockerfile的COPY指令二、使用Docker CP命令三、使用Docker Volume四、综合应用Docker作为一种轻量级的容器化技术,在软件开发和部署中得到了广泛应用。在使用Docker时,经常需要将本地文件或目录复制到Docker镜像中,以便在容器内部使用…

Figma入门-文字、样式、链接、动作

Figma入门-文字、样式、链接、动作 前言 在之前的工作中&#xff0c;大家的原型图都是使用 Axure 制作的&#xff0c;印象中 Figma 一直是个专业设计软件。 最近&#xff0c;很多产品朋友告诉我&#xff0c;很多原型图都开始用Figma制作了&#xff0c;并且很多组件都是内置的…

shell编程(8) until循环以及函数基本创建调用

声明!!! 学习视频来自B站UP主泷羽sec&#xff0c;如涉及侵权马上删除文章 视频链接&#xff1a;泷羽sec 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 # until循环 脚本代码&#xff1a; i0 until [ ! $i -lt 1…

NVR管理平台EasyNVR多品牌NVR管理工具的流媒体视频融合与汇聚管理方案

随着信息技术的飞速发展&#xff0c;视频监控已经成为现代社会安全管理和业务运营不可或缺的一部分。无论是智慧城市、智能交通、还是大型企业、校园安防&#xff0c;视频监控系统的应用都日益广泛。NVR管理平台EasyNVR&#xff0c;作为功能强大的流媒体服务器软件&#xff0c;…

fastadmin实现站内通知功能

实现效果如下 application/admin/view/common/header.html <style>#notificationMenu {display: none;position: absolute;top: 40px;right: 0;background: #fff;border-radius: 6px;padding: 10px 0;width: 300px;box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);z-inde…

大语言模型---LoRA中损失值的计算

文章目录 概要损失计算流程小结 概要 Llama-7B模型的LoRA微调训练中&#xff0c;通过使用Cross-Entropy Loss来度量模型输出的预测分布和真实标签分布之间的距离&#xff0c;来衡量模型的准确性。 本文主要介绍LoRA中损失值的计算流程。 Cross-Entropy Loss作用&#xff1a;是…

【Vue】指令扩充(指令修饰符、样式绑定)

目录 指令修饰符 按键修饰符 事件修饰符 双向绑定指令修饰符 输入框 表单域 下拉框 单选按钮 复选框 样式绑定 分类 绑定class 绑定style tab页切换示例 指令修饰符 作用 借助指令修饰符&#xff0c;可以让指令的功能更强大 分类 按键修饰符&#xff1a;用来…

集成金蝶云星空数据至MySQL的完整案例解析

金蝶云星空数据集成到MySQL的技术案例分享 在企业信息化系统中&#xff0c;数据的高效流动和准确同步是确保业务连续性和决策支持的重要环节。本文将聚焦于一个具体的系统对接集成案例——金蝶云星空的数据集成到MySQL&#xff0c;方案名称为“2金蝶物料同步到商城中间表”。 …

为什么transformer的时间复杂度是N的平方,具体是里面的哪一个计算流程最占用时间

Transformer的时间复杂度为 O(N2)&#xff0c;其中 NN 是输入序列的长度。这一复杂度主要来源于自注意力机制&#xff08;self-attention mechanism&#xff09;的计算过程。 在Transformer模型中&#xff0c;自注意力机制的核心步骤是计算查询&#xff08;Query&#xff09;、…

如何在Linux上安装Canal同步工具

1. 下载安装包 所用到的安装包 canal.admin-1.1.4.tar.gz 链接&#xff1a;https://pan.baidu.com/s/1B1LxZUZsKVaHvoSx6VV3sA 提取码&#xff1a;v7ta canal.deployer-1.1.4.tar.gz 链接&#xff1a;https://pan.baidu.com/s/13RSqPinzgaaYQUyo9D8ZCQ 提取码&#xff1a;…

操作系统大会2024 | 麒麟信安根植openEuler社区,持续技术创新 共拓新应用 探索新机遇

[中国&#xff0c;北京&#xff0c;2024年11月15日] 以“以智能&#xff0c;致世界”为主题的操作系统大会2024在北京中关村国际创新中心召开&#xff0c;本次大会由openEuler社区和全球计算联盟主办&#xff0c;旨在汇聚全球产业界力量&#xff0c;推动基础软件根技术持续创新…

Wallpaper壁纸制作学习记录03

添加用户属性 Wallpaper Engine 允许用户在用户属性的帮助下进一步自定义您的壁纸。用户属性允许您为用户提供进一步调整和自定义壁纸各个方面的选项&#xff0c;包括完全隐藏壁纸中的对象。 创建可见性属性 每个元素在右上角都有一个 visibility 属性&#xff08;由眼睛图标…

杰理-gpadc

gpadc API是系统提供的用于adc采集的接口 void adc_init(); //adc功能初始化&#xff0c;一般在板级配置.c文件已经默认调用&#xff0c;用户无需再重复调用。 示例&#xff1a; static void WANG_printf(void *_arg) {//adc_init(); //板级配置中默认会调用&#xff0c;实际…

如何使用Jmeter做性能测试?

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 今天我们来说说jmeter如何进行性能测试&#xff0c;我们都知道jmeter工具除了可以进行接口功能测试外&#xff0c;还可以进行性能测试。当项目趋于稳定&#xf…

【CSP CCF记录】201903-1第16次认证 小中大

题目 样例1输入 3 -1 2 4 样例1输出 4 2 -1 样例1解释 4 为最大值&#xff0c;2 为中位数&#xff0c;−1 为最小值。 样例2输入 4 -2 -1 3 4 样例2输出 4 1 -2 样例2解释 4 为最大值&#xff0c;(−13)21为中位数&#xff0c;−2为最小值。 思路 本题两个注意点&#xff0…

windows下,用CMake编译qt项目,出现错误By not providing “FindQt5.cmake“...

开发环境&#xff1a;windows10 qt5.14&#xff0c; 编译器msvc2017x64&#xff0c;CMake3.30&#xff1b; 现象&#xff1a; CMakeList文件里&#xff0c;如有find_package(Qt5 COMPONENTS Widgets REQUIRED) target_link_libraries(dis_lib PRIVATE Qt5::Widgets) 用CMak…

自由学习记录(23)

Lua的学习 table.concat(tb,";") 如果表里带表&#xff0c;则不能拼接&#xff0c;表里带nil也不能&#xff0c;都会报错 true和false也不可以&#xff0c;数字和字符串可以 if要和一个end配对&#xff0c;所以 if a>b then return true end end 两个end …

JavaWeb-表格标签-06

表格标签 table code: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>表格标签</title><…

【Stable Diffusion】 超大尺寸绘制、分区控制,详解Tiled Diffusion VAE插件功能

今天&#xff0c;我们将向您介绍一款令人兴奋的AI工具——Tiled Diffusion & VAE插件。这是一款基于Stable Diffusion技术的创新应用&#xff0c;旨在为您提供超大尺寸绘制和分区控制的便捷体验。无论您是AI绘画的新手还是专业人士&#xff0c;这个工具都能为您带来极大的便…