C++学习第二十九课:C++ 输入输出流详解:从基础到高级应用

在这里插入图片描述

在 C++ 中,流(stream)是一种用于实现输入输出操作的抽象概念。流可以看作是字节的流动,这些字节可以从一个地方流向另一个地方,例如从键盘输入到程序中,或者从程序输出到屏幕。C++ 提供了一套完整的流库来处理各种类型的输入和输出,包括文件 I/O、字符串处理等。本文将详细介绍 C++ 中使用流进行输入和输出的方法,并结合实际案例进行讲解。

一、输入输出流的基本概念

在 C++ 中,流是通过流对象来操作的。流对象是 std 命名空间中的类模板实例化得到的对象,主要包括 istreamostreamiostream 三种类型。其中,istream 用于输入操作,ostream 用于输出操作,而 iostream 是前两者的组合。

1.1 标准输入输出流对象

C++ 预定义了四个标准流对象,分别是 cincoutcerrclog。它们分别对应于标准输入、标准输出、标准错误和标准日志。

示例代码:

#include <iostream>int main() {// 使用 cout 输出一段文本std::cout << "Hello, World!" << std::endl;// 使用 cin 读取一个整数int x;std::cin >> x;std:cout << "You entered: " << x << std::endl;return 0;
}

二、格式化输入输出

C++ 提供了一些操纵符(manipulator)来控制输出格式,例如设置填充字符、对齐方式、宽度等。

2.1 设置输出格式

示例代码:

#include <iostream>
#include <iomanip>int main() {int num = 12345;// 设置宽度为 10,向右对齐,不足位用 '0' 补齐std::cout << std::setw(10) << std::right << std::setfill('0') << num << std::endl;// 设置宽度为 10,向左对齐,不足位用空格补齐std::cout << std::setw(10) << std::left << num << std::endl;// 设置输出为十六进制形式std::cout << std::hex << num << std::endl;return 0;
}

三、文件输入输出

C++ 的 fstream 库提供了用于文件操作的类,包括 ifstream(用于读取文件)、ofstream(用于写入文件)和 fstream(同时支持读写)。

3.1 文件打开与关闭

示例代码:

#include <fstream>
#include <iostream>int main() {// 以读模式打开文件std::ifstream infile("example.txt");if (!infile) {std::cerr << "Error opening file for reading." << std::endl;return 1;}// 以写模式创建或覆盖文件std::ofstream outfile("output.txt");if (!outfile) {std::cerr << "Error opening file for writing." << std::endl;return 1;}// 关闭文件infile.close();outfile.close();return 0;
}

案例:读写CSV文件

CSV(逗号分隔值)文件是一种常见的数据存储格式。使用C++流可以方便地读写CSV文件。

#include<fstream>
#include<sstream>
#include<vector>
#include<string>std::vector<std::vector<std::string>> readCSV(const std::string& filename) {std::vector<std::vector<std::string>> data;std::ifstream infile(filename);std::string line;while (std::getline(infile, line)) {std::istringstream iss(line);std::vector<std::string> row;std::string value;while (std::getline(iss, value, ',')) {row.push_back(value);}data.push_back(row);}return data;
}void writeCSV(const std::string& filename, const std::vector<std::vector<std::string>>& data) {std::ofstream outfile(filename);for (const auto& row : data) {for (size_t i = 0; i < row.size(); ++i) {outfile<< row[i];if (i < row.size() - 1) {outfile<< ",";}}outfile<< std::endl;}
}int main() {std::vector<std::vector<std::string>> data = readCSV("input.csv");writeCSV("output.csv", data);return 0;
}

四、字符串流

C++ 的 sstream 库提供了用于字符串操作的类,包括 istringstream(用于从字符串读取数据)、ostringstream(用于向字符串写入数据)和 stringstream(同时支持读写)。

4.1 字符串读写操作

示例代码:

#include <sstream>
#include <iostream>
#include <string>int main() {// 创建一个字符串流对象std::istringstream iss("Hello, World!");// 从字符串流中读取数据std::string word;while (iss >> word) {std::cout << word << std::endl;}// 向字符串流中写入数据std::ostringstream oss;oss << "Number: " << 42;std::string result = oss.str();std::cout << result << std::endl;return 0;
}

五、总结

通过本文的介绍,我们了解了 C++ 中使用流进行输入和输出的基本概念和方法。流是 C++ 中处理输入输出的重要工具,它提供了一种灵活且高效的方式来处理不同类型的数据。在实际编程中,我们需要根据具体需求选择合适的流对象和操作方法,以便更好地完成输入输出任务。希望本文能够帮助大家更好地理解和掌握 C++ 中的流操作。

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

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

相关文章

Qt中正则表达式的用法

一.基本功能介绍&#xff1a; 在Qt中&#xff0c;可以使用QRegularExpression类来处理正则表达式。以下是一些常用的正则表达式用法&#xff1a; 1.创建正则表达式对象&#xff1a; QRegularExpression regex("pattern"); 2.匹配字符串&#xff1a; QString str …

LeetCode 2960.统计已测试设备:看测试了多少次

【LetMeFly】2960.统计已测试设备&#xff1a;看测试了多少次 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-tested-devices-after-test-operations/ 给你一个长度为 n 、下标从 0 开始的整数数组 batteryPercentages &#xff0c;表示 n 个设备的电池百分比…

【QEMU系统分析之实例篇(十七)】

系列文章目录 第十七章 QEMU系统仿真的机器创建分析实例 文章目录 系列文章目录第十七章 QEMU系统仿真的机器创建分析实例 前言一、QEMU是什么&#xff1f;二、QEMU系统仿真的机器创建分析实例1.系统仿真的命令行参数2.配置加速器configure_accelerators()do_configure_icount…

蓝桥杯13届JAVA A组 国赛

​​​​​​​ package 蓝桥杯国赛; // 贪心选个数最少的进行摆 // 2:1 ,3:1, 4:1,5 : 3,6:3,7:1 // 选 1&#xff0c;7&#xff0c;4&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;9 // 然后都选满10个 public class 火彩棒数字 {public static void main(String[] a…

【CTFHub】HTTP 请求方式 302跳转 cookie WP

1.请求方式 打开给出的URL进入一个页面&#xff0c;提示原方法是GET&#xff0c;用CTFHUB方法就能获得flag 思路&#xff1a;抓包&#xff0c;将GET方法改成CTFHUB方法进行重新发送请求&#xff0c;查看响应情况 1.打开代理服务器 2.打开BurpSuite 刷新页面获得拦截 3.发送…

【Excel VBA】深入理解 VBA 中的 CallByName 函数

动态调用方法与属性&#xff1a;深入理解 VBA 中的 CallByName 函数 昨天在介绍Choose函数在复杂的VBA应用程序开发中&#xff0c;有时我们需要根据运行时的情况来决定调用哪个对象的哪个方法或属性。这种灵活性可以通过 CallByName 函数实现。在本篇博客中&#xff0c;田辛老…

网络Http和Socket通讯(基于面试)

每日一句&#xff1a;想得到世上最好的东西&#xff0c;先得让世界看到最好的你 目录 面试问OSI或TCP/IP,怎么回答&#xff1f; 面试问HTTP&#xff1f; 面试问Get类型&#xff0c;Pot类型区别&#xff1f; 面试什么是Socket套接字&#xff1f; 面试问什么是数据粘包&…

qt for android 的架构原理

qt for android实现架构&#xff0c;分享这几幅很不错图。来自于 《Qt 林斌&#xff1a;整合Android IVI平台打造统一的Qt数字座舱体验》 1.实现架构图 2.qt for android能力 3.java 和 qt混合开发 4. AutoMotive

46寸硅片为什么要留平边(flat)?

知 识星球&#xff08;星球名&#xff1a; 芯片制造与封测社区&#xff0c;星球号&#xff1a; 63559049&#xff09;里的学员问&#xff1a; 2&#xff0c; 4&#xff0c; 6寸硅片都有 平 边&#xff0c;它们有什么作用 &#xff1f; 硅片的平边&#xff08;Flat&…

经典权限五张表案例分析

文章目录 模块分析模块分析 描述五张表的关系重要知识讲解抽取成一个BaseServletSpringIOC思想(底层)实现代码IOC概述 SPI机制(为学习框架做思想和技术铺垫)SPI引入1. 标准/规范2. 具体的实现3. 调用 SPI介绍SPI练习JDBC4.0免注册驱动原理Servlet实现方式三 ServletContainerIn…

idea使用前的全局配置,一次配置,多次使用

前提&#xff1a;每次导入一个新的项目&#xff0c;就需要重新设置编码、maven、jdk、git版本等信息。实际每个项目所用到的配置信息是一致的&#xff0c;除非换一家公司&#xff0c;不然不会改动到这些内容。 idea版本&#xff1a;2024.1.1 1.1、全局Maven配置 IDEA启动页面…

微火一文盘点:为何全域运营系统会成为创业新风口?

当前&#xff0c;微火全域运营已经成为创业的新风口&#xff0c;想要做微火全域运营服务商的创业者数量日益增多。据目前了解到的最新消息&#xff0c;微火全域运营系统的市场占有率已经超过了48%&#xff0c;并且还在持续不断地上涨中。 所谓微火全域运营系统&#xff0c;就是…

InLine Chat功能优化对标Github Copilot,CodeGeeX带来更高效、更直观的编程体验!

VSCode中的CodeGeeX 插件上线InLine Chat功能后&#xff0c;收到不少用户的反馈&#xff0c;大家对行内交互编程这一功能非常感兴趣。近期我们针对这个功能再次进行了深度优化&#xff0c;今天详细介绍已经在VSCode插件v2.8.0版本上线的 CodeGeeX InLine Chat功能&#xff0c;以…

蓝桥杯成绩已出

蓝桥杯的成绩早就已经出来了&#xff0c;虽然没有十分惊艳 &#xff0c;但是对于最终的结果我是心满意足的&#xff0c;感谢各位的陪伴&#xff0c;关于蓝桥杯的刷题笔记我已经坚持更新了49篇&#xff0c;但是现在即将会告别一段落&#xff0c;人生即将进入下一个规划。我们一起…

Spring框架学习笔记(一):Spring基本介绍(包含IOC容器底层结构)

1 官方资料 1.1 官网 https://spring.io/ 1.2 进入 Spring5 下拉 projects, 进入 Spring Framework 进入 Spring5 的 github 1.3 在maven项目中导入依赖 <dependencies><!--加入spring开发的基本包--><dependency><groupId>org.springframework<…

jni 返回二维byte数组

在JNI中返回二维byte数组&#xff0c;你需要在Java中准备一个相应的二维数组来接收这个返回值。在JNI层面&#xff0c;你可以创建一个二维的byte数组&#xff0c;并使用GetByteArrayRegion和SetByteArrayRegion来操作它。 以下是一个简单的例子&#xff1a; public class Jni…

基于STC12C5A60S2系列1T 8051单片机实现一主单片机与一从单片机进行双向串口通信功能

基于STC12C5A60S2系列1T 8051单片机实现一主单片机与一从单片机进行双向串口通信功能 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机串口通信介绍STC12C5A60S2系列1T 8051单片机串口通信的结构基于STC12C5A60S2系列1T 8051单片机串口通信的特殊功能寄存器…

QT---day5,通信

1、思维导图 2、TCp 服务器 #ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include <QTcpServer> #include <QList> #include <QTcpSocket> #include <QMessageBox> #include <QDebug> #include <QTcpServer> QT_B…

镭速实现利用Libarchive实现高效、智能的文件传输和管理

在前一篇报道中&#xff0c;我们阐述了Libarchive这一开源库的强大功能&#xff0c;它专门用于处理归档文件。通过整合Libarchive&#xff0c;镭速在包括Windows和Linux在内的多个操作系统上提供了在线解压缩服务&#xff0c;为企业构建了一个既强大又安全的文件传输系统&#…