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://xiahunao.cn/news/3031208.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

C语言什么是散列法?

一、问题 什么是散列法&#xff1f; 二、解答 散列法是⼀种将字符组成字符串&#xff0c;转换为固定长度&#xff08;⼀般是更短长度&#xff09;的数值或索引值的⽅法&#xff0c;也叫哈希法&#xff0c;⼜可以称为杂凑法或关键码⼀地址转换法。 那么&#xff0c;通过散列函数…

嵌入式开发十一:GPIO端口的八种工作模式

功夫不负有心人&#xff0c;相信学习至此你已经掌握了入门STM32基础知识。希望通过前面的学习&#xff0c;你已经掌握了 STM32 开发的工具和方法。本篇博客我们将和大家一起来学习 STM32 的一个最基础设&#xff0c;这些外设实际项目中经常会用到&#xff0c;希望大家认真学习和…

Html生成自定义函数的图形(2024/5/10)

大概效果如下&#xff1a; 可以自定义函数和x的定义域。 我们可以使用数学表达式解析库来解析用户输入的函数方程&#xff0c;并根据给定的 x 区间计算函数的值&#xff0c;然后使用图表库绘制图形。 在这里&#xff0c;我将使用 math.js 库来解析数学表达式&#xff0c;并使…

杰发科技AC7801——ADC之Bandgap和内部温度计算

0. 参考 电流模架构Bandgap设计与仿真 bandgap的理解&#xff08;内部带隙电压基准&#xff09; ​ ​ 虽然看不懂这些公式&#xff0c;但是比较重要的一句应该是这个&#xff1a;因为传统带隙基准的输出值为1.2V ​ 1. 使用 参考示例代码。 40002000是falsh控制器寄…

2024数维杯数学建模竞赛A题完整代码和思路论文解析

2024数维杯数学建模完整代码和成品论文已更新&#xff0c;获取↓↓↓↓↓ https://www.yuque.com/u42168770/qv6z0d/bgic2nbxs2h41pvt?singleDoc# 2024数维杯数学建模A题34页论文已完成&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&…

Python-VBA函数之旅-slice函数

目录 一、slice函数的常见应用场景 二、slice函数使用注意事项 三、如何用好slice函数&#xff1f; 1、slice函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a; https://blog.csdn.net/ygb_1024?spm1010.…

【Python特征工程系列】排列重要性法分析特征重要性-随机森林模型为例(案例+源码)

这是我的第277篇原创文章。 一、引言 排列重要性&#xff08;Permutation Importance&#xff09;是一种基于模型的方法&#xff0c;用于评估每个特征对模型性能的影响程度。该方法通过随机打乱单个特征的值并观察模型性能的变化&#xff0c;从而确定特征的重要性。如果某个特征…

postgresql主从复制

用vmware 搭建的两台虚拟机 操作系统&#xff1a;Ubuntu 24.04 Server版 数据库&#xff1a;postgresql 16.2 主库&#xff1a;192.168.2.11 从库&#xff1a;192.168.2.12 如果遇到网络无法上网&#xff0c;可参考一下 Vmware 搭建的Ubuntu 24.04 网络配置-CSDN博客 1.两…

实时路况信息:盲人出行的守护者

在这个快速发展的数字时代&#xff0c;科技的力量正以前所未有的方式改变着人们的生活&#xff0c;尤其是对于视障群体而言&#xff0c;技术的每一次进步都可能意味着独立与自由的新篇章。在这样的背景下&#xff0c;实时路况信息对盲人的帮助成为了社会关注的热点话题&#xf…

train_gpt2_fp32.cu

源程序 llm.c/test_gpt2_fp32.cu at master karpathy/llm.c (github.com) #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #include <assert.h> #include <float.h> #include <string.h> #include…

【机器学习300问】85、Adam梯度下降优化算法的原理是什么?

Adam优化算法取了两个算法名称的首字母——Adaptive Moment Estimation的缩写&#xff0c;结合了Momentum算法和RMSprop算法的优点。在Momentum中&#xff0c;会计算前一时刻的梯度&#xff0c;并将其用于当前时刻的梯度更新&#xff1b;而RMSprop会对梯度的大小进行自适应调整…

闭散列哈希表

一、什么是 哈希 &#xff1f; 1.1 哈希概念 与 哈希冲突 在正式介绍闭散列哈希之前&#xff0c;我们需要明确 哈希 的概念。 哈希 &#xff1a;构造一种数据存储结构&#xff0c;通过函数 HashFunc() &#xff0c;使 元素的存储位置 与 其对应的键值 建立一一映射关系&…

数电——集成计数器(部分)

数电77-集成二进制同步计数器_哔哩哔哩_bilibili 74LS191 同步二进制可逆计数器 单时钟 功能&#xff1a; 要想有置零功能&#xff0c;可以将输入改为0000&#xff0c;然后运用功能里的置数功能 双时钟74LS193 四位同步二进制可逆计数器 功能&#xff1a; 74LS197 二-八-…

nestjs 全栈进阶--中间件

视频教程 22_nest中中间件_哔哩哔哩_bilibili 1. 介绍 在Nest.js框架中&#xff0c;中间件&#xff08;Middleware&#xff09;是一个非常重要的概念&#xff0c;它是HTTP请求和响应生命周期中的一个重要组成部分&#xff0c;允许开发者在请求到达最终的目的控制器方法之前或…

Java苍穹外卖05-订单状态定时处理-数据统计-导出excel

一、订单状态定时处理 1.Spring Task ①介绍 应用场景&#xff1a; ②cron表达式 https://cron.qqe2.com/ ③入门案例 2.需求分析 3.代码开发 每一分钟检查是否存在超时15分钟的订单 每天凌晨一点处理上一条处于派送中的订单 mapper&#xff1a; 二、来单提醒、客户催单 1…

前端崽的java study笔记

文章目录 basic1、sprint boot概述2、sprint boot入门3、yml 配置信息书写和获取 basic 1、sprint boot概述 sprint boot特性&#xff1a; 起步依赖&#xff08;maven坐标&#xff09;&#xff1a;解决配置繁琐的问题&#xff0c;只需要引入sprint boot起步依赖的坐标就行 自动…

IF:23.2|从实验室到田间,微生物干预提高植物抗逆

期刊&#xff1a;Nature Food 影响因子&#xff1a;23.2 发表时间&#xff1a;2023年10月 本研究介绍了一种名为SynCom的微生物组合&#xff0c;该组合Rhodococcus erythropolis和Pseudomonas aeruginosa两种微生物组成。这两种微生物能够帮助水稻抵抗铝毒害和磷缺乏&…

##13 如何在Python中优雅地使用异常处理

文章目录 引言1. 异常处理基础2. 处理多种异常3. 捕捉所有异常4. finally 语句5. 自定义异常结语参考链接 引言 在编程中&#xff0c;错误是在所难免的。Python提供了异常处理机制&#xff0c;允许程序在遇到错误时优雅地恢复。本文将介绍Python中异常处理的基本概念&#xff…

activiti 工作流基本使用

Activiti 介绍 Activiti 是一个开源架构的工作流引擎&#xff0c;基于bpmn2.0 标准进行流程定义。其前身是JBPM&#xff0c;Activiti 通过嵌入到业务系统开发中进行使用。 官方是这样介绍 activiti的&#xff1a; Activiti 是领先的轻量级、以 Java 为中心的开源 BPMN 引擎&…

前端小技巧:如何自定义网页的右键菜单(如何禁用网页的右键菜单)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 右键菜单设置 📒📝 自定义右键菜单实现步骤📝 示例代码📝 涉及的JavaScript语法和参数📝 禁用特定区域的右键菜单⚓️ 相关链接 ⚓️📖 介绍 📖 在网页设计中,一个直观且个性化的右键菜单可以显著提升用户的交互…