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

一、引言

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt之QMainWidget相关

QMainWindow 继承于QWidget的子类 自带一个菜单栏,一个工具栏,可以设置状态栏与铆钉部件 菜单栏:QMenuBar 注意:一个窗口最多一个菜单栏 API: 创建 QMenuBar(parent) 获取QMainWindow自带的菜单栏 QMenuBar* menuBar() 添加菜单:QMenu addMenu(QMenu *menu); 菜单添加活动:QAct…

【深度学习之一】2024最新pytorch+cuda+cudnn下载安装搭建开发环境

兵马未动&#xff0c;粮草先行。作为深度学习的初学者&#xff0c;快速搭建一个属于自己的开发环境就是头等大事&#xff0c;可以让我们节省许多的时间。这一期我们主要讲一讲2024年最新pytorchcudacudnn下载安装搭建开发环境&#xff0c;以及安装过程中可能遇到的一些问题以及…

SQL 复杂查询

目录 复杂查询 一、目的和要求 二、实验内容 &#xff08;1&#xff09;查询出所有水果产品的类别及详情。 查询出编号为“00000001”的消费者用户的姓名及其所下订单。&#xff08;分别采用子查询和连接方式实现&#xff09; 查询出每个订单的消费者姓名及联系方式。 在…

如何在 UniApp 中实现 iOS 版本更新检测

随着移动应用的不断发展&#xff0c;保持应用程序的更新是必不可少的&#xff0c;这样用户才能获得更好的体验。本文将帮助你在 UniApp 中实现 iOS 版的版本更新检测和提示&#xff0c;适合刚入行的小白。我们将分步骤进行说明&#xff0c;每一步所需的代码及其解释都会一一列出…

ssm面向品牌会员的在线商城小程序

摘要 随着Internet的发展&#xff0c;人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化&#xff0c;网络化和电子化。它将是直接管理面向品牌会员的在线商城小程序的最新形式。本小程序是以面向品牌会员的在线商城管理为目标&#xff0c;使用 java技术制…

《OpenCV 图像缩放、翻转与变换全攻略:从基础操作到高级应用实战》

简介&#xff1a;本文详细阐述了 OpenCV 在图像操作中的关键技术&#xff0c;包括缩放&#xff08;确定尺寸缩放与按比例缩放&#xff09;、翻转&#xff08;沿不同轴的翻转方式&#xff09;以及变换&#xff08;平移、旋转、三点确定变换和四点确定变换即透视变换&#xff09;…

sql注入报错分享(mssql+mysql)

mysql mysql的报错内容比较多 网上也有比较多的 这里重复的就不多介绍了。一笔带过 溢出类 bigint 当超过mysql的整形的时候&#xff0c;就会导致溢出&#xff0c;mysql可能会将错误信息带出。这里user()是字母默认为0 取反以后1可能就会导致异常。 报错特征 BIGINT UNSIG…

FastAPI重载不生效?解决PyCharm中Uvicorn无法重载/重载缓慢的终极方法!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 重载缓慢 📒📝 问题概述🚨 相关原因📝 解决方案一📝 解决方案二📝 解决方案三📝 解决方案四⚓️ 相关链接 ⚓️📖 介绍 📖 在使用FastAPI开发时,reload=True 本应让你在修改代码后自动重启服务,提升开发效率…

AI智能稿件排版系统订单管理系统

在现代制造业和服务行业中&#xff0c;高效的生产流程和精确的订单管理是企业保持竞争优势的核心要素。AI智能稿件排版系统和订单管理系统作为一体化解决方案&#xff0c;以其强大的自动化能力和智能化技术&#xff0c;帮助企业实现排版效率提升、数据格式兼容性增强和生产流程…

jetson orin系列开发版安装cuda的gpu版本的opencv

opencv安装包下载地址&#xff1a; https://github.com/opencv/opencv/扩展库下载地址&#xff1a; https://github.com/opencv/opencv_contrib1. 删除jetpack包中的opencv版本 原先的opencv库安装在目录/usr/lib/aarch64-linux-gnu/下&#xff08;一般其他的第三方库也都安…

24小时自动监控,自动录制直播蓝光视频!支持抖音等热门直播软件

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 工具特点📒📝 使用🎈 获取方式 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 对于许多直播爱好者和内容创作者而言,错过心爱的直播或难以搜集视频素材始终是一个难题。今天,给大家分享的这款工具可以轻松解决这个问题,它拥有…

dockerfile构建Nginx镜像练习二(5-2)

环境准备&#xff1a; (1)保证拥有centos基础镜像 docker images | grep centos (2)服务器保证可以连接外网 1.创建工作目录 mkdir nginx cd nginx 2.在工作目录中创建并编写Dockerfile文件 vim dockerfile #定义基础镜像 FROM centos:7#维护者信息(可缺省) MAINTAINER d…

Etcd 框架

基本了解 客户端、长连接与租约的关系 客户端对象 etcd的客户端对象是用户与etcd服务进行交互的主要接口&#xff0c;主要功能就是存储、通知和事务等功能访问 键值存储&#xff1a;客户端通过put 和 get操作存储数据&#xff1b;数据存储在etcd的层级化键值数据库中监听器&a…

滑动窗口篇——如行云流水般的高效解法与智能之道(1)

前言&#xff1a; 上篇我们介绍了双指针算法&#xff0c;并结合具体题目进行了详细的运用讲解。本篇我们将会了解滑动窗口。滑动窗口是一种常用的算法技巧&#xff0c;主要用于处理子数组、子串等具有“窗口”特性的题目。柳暗花明&#xff0c;乃巧解复杂问题的高效之道。 一. …

数据结构-树状数组专题(2)

一、前言 接上回树状数组专题&#xff08;1&#xff09;&#xff0c;这次主要介绍差分跟树状数组联动实现区间更新 二、我的模板 重新放了一遍&#xff0c;还是提一嘴&#xff0c;注意下标从0开始&#xff0c;区间左闭右开 template <typename T> struct Fenwick {in…

QA|使用 MapleSim 模拟卷料生产 (Converting)和卷对卷系统 (R2R)

使用 MapleSim 模拟卷料生产 (Converting)和卷对卷系统 (R2R) 纸张、薄膜、塑料、金属箔、新能源电池和卷料生产设备 (converting equipment) 的制造商正在转向建模和仿真&#xff0c;以提升卷料处理的设备性能和产品质量。MapleSim 卷料处理库提供了专业的建模元件以及功能&a…

2024ARM网络验证 支持一键云注入引流弹窗注册机 一键脱壳APP加固搭建程序源码及教程

此套源码功能强大&#xff0c;支持APK脱壳、注入、网络验证、注册机、引流弹窗、更新弹窗和公告等功能&#xff0c;并具有强大的系统应用管理端&#xff0c;可轻松管理用户数量和卡密状态等数据统计。armpro脱壳软件可在线修改手机文件和游戏数据&#xff0c;并可添加会员功能、…

汉诺塔(hanio)--C语言函数递归

文章目录 前言一、汉诺塔的图解二、问题分析总结 前言 什么是汉诺塔&#xff1f; 汉诺塔(Tower of Hanoi)&#xff08;也称河内塔&#xff09;是有法国数学家爱德华卢卡斯于1883年发明的一道智力题。它源于印度的一个古老传说&#xff1a;大梵天创造世界的时候做了三根钻石柱子…

【MySQL】数据库精细化讲解:内置函数知识穿透与深度学习解析

前言&#xff1a;本节内容讲述mysql里面的函数的概念&#xff0c; 在mysql当中&#xff0c; 内置了很多函数工作。 这些函数丰富了我们的操作。 比如字符串函数、数据函数以及一些其他函数等等。 ps:友友们学习了表的基本操作后就可以观看本节内容啦! 目录 日期函数 current_…

Is:cannat access /data: Input/output error

说明&#xff1a; 1&#xff09;访问应用业务&#xff0c;输入账号密码报如下图所示&#xff1a;invalid login. 2&#xff09;登录服务器查看数据日志&#xff0c;报如下图所示&#xff1a;ls:cannot access /data: Input/output error 3&#xff09;查看日志dmesg |grep erro…