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.rhkb.cn/news/324326.html

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

相关文章

区块链(打新)如何被割韭菜

看上去&#xff0c;像我只要去每个都买一遍新发行的代币&#xff0c;一定可以成功的 但是好像没有想象中这么简单&#xff0c;因为这些山寨币&#xff0c;庄家可以自己控盘的&#xff0c;看上去好像有跌宕起伏的买卖&#xff0c;但是一单掀桌子&#xff0c;庄家他自己都不玩了…

mac 讨厌百度网盘怎么办

一、别拦我 首先请允许我泄个愤&#xff0c;tmd百度网盘下个1g的文件下载速度竟然超不过200k&#xff0c;只要不放在所有已打开软件的最前面&#xff0c;它就给你降到10k以内&#xff0c;关键是你慢就慢了&#xff0c;我也不是很着急&#xff0c;关键是你日常下载失败并且总是…

Ubuntu18.04--虚拟机配置Samba并从Windows登录

前言&#xff1a; 本文记录我自己在Windows上安装 Virtualbox &#xff0c;并在Virtualbox中安装 Ubuntu-18.04 虚拟机&#xff0c;在Ubuntu-18.04虚拟机里安装配置Smaba服务器&#xff0c;从 Windows 宿主系统上访问虚拟机共享samba目录的配置命令。 引用: N/A 正文 虚拟…

鸿蒙OpenHarmony开发板解析:【特性配置规则】

特性 特性配置规则 下面介绍feature的声明、定义以及使用方法。 feature的声明 开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 在部件的bundle.json文件中通过feature_list来声明部件的feature列…

【栈】Leetcode 验证栈序列

题目讲解 946. 验证栈序列 算法讲解 在这里就只需要模拟一下这个栈的出栈顺序即可&#xff1a;使用一个stack&#xff0c;每次让pushed里面的元素入栈&#xff0c;如果当前栈顶的元素等于poped容器中的当前元素&#xff0c;因此就需要让栈顶元素出栈&#xff0c;poped的遍历…

W801学习笔记二十二:英语背单词学习应用——下

续上篇&#xff1a; W801学习笔记二十一&#xff1a;英语背单词学习应用——上 五、处理用户交互 由于英语也是采用了和唐诗一样的《三分钟限时挑战》《五十题竞速挑战》《零错误闯关挑战》&#xff0c;所以用户交互的逻辑和唐诗是一样的。所以&#xff0c;我们抽一个基类&a…

Java入门基础学习笔记7——Intellij IDEA开发工具概述、安装

之前的开发工具存在一些问题&#xff1a; 文本编辑工具&#xff1a;记事本、NotePad、EditPlus、Sublime...编写代码的时候没有错误提醒、没有智能代码提示、需要自己进行编译、执行、功能不够强大。 集成开发环境&#xff08;IDE&#xff1a;Integrated Development Environm…

SQL注入(sqli-labs第一关)

sqli-labs第一关 方法一&#xff1a;手工注入 来到第一关&#xff0c;图上说我们需要一个数字的参数 于是我们先手工注入?id1 and 11 跟?id1 and 12发现页面没有报错 每张截图上面页面中有select查询语句&#xff0c;这是我在第一关的源码中加上了echo "$sql ";…

探索无界知识:用 ChatGPT 的原理学习任何事物!

为避免文章重复&#xff0c;您的文本已通过更改句式、用词以及句子结构进行了修改。现在的文本应该能更好地满足去重的需求&#xff1a; 从ChatGPT原理出发&#xff0c;我们探讨GPT如何启发人类学习和构建个人知识体系。 1. 明确学习目标 机器学习必须依靠目标函数。同样&…

408算法题专项-2019年

题目&#xff1a; 分析&#xff1a;要求空间复杂度为O&#xff08;1&#xff09;&#xff0c;我们可以逆向假设可以开空间&#xff0c;得出一种思路&#xff0c;然后对这种思路优化空间即可得到O&#xff08;1&#xff09; 思路一&#xff1a;假设开空间 思考&#xff1a;再开…

fswatch工具:跟踪Linux中的文件和目录更改

fswatch是一个跨平台的文件更改监视器&#xff0c;当指定文件或目录的内容被更改或修改时&#xff0c;它会收到通知警报。 fswatch在不同的操作系统上执行多种类型的监视器&#xff0c;例如&#xff1a; 基于 Apple OS X 的文件系统事件 API 构建的监视器。基于kqueue的监视器…

05、Kafka 操作命令

05、Kafka 操作命令 1、主题命令 &#xff08;1&#xff09;创建主题 kafka-topics.sh --create --bootstrap-server 192.168.135.132:9092,192.168.135.133:9092,192.168.135.134:9092 --topic test1 --partitions 4 --replication-factor 3–bootstrap-server&#xff1a;…

互动科技如何强化法治教育基地体验?

近年来&#xff0c;多媒体互动技术正日益融入我们生活的各个角落&#xff0c;法治教育领域亦不例外。步入法治教育基地&#xff0c;我们不难发现&#xff0c;众多创新的多媒体互动装置如雨后春笋般涌现&#xff0c;这些装置凭借前沿的科技手段&#xff0c;不仅极大地丰富了法制…

Capl中的运算符

Capl中的运算符类似于C语言。由于capl中没有指针的概念&#xff0c;所以没有指针取值&#xff0c;取地址等运算符。 Capl中的运算符优先级同C语言一样&#xff0c;同样小括号可以 提升优先级。 1.算数运算符 整数类型之间的数据进行除法运算&#xff0c;结果一定是整数。如果…

双目相机标定流程(MATLAB)

一&#xff1a;经典标定方法 1.1OPENCV 1.2ROS ROS进行双目视觉标定可以得到左右两个相机的相机矩阵和畸变系数&#xff0c;如果是单目标定&#xff0c;用ROS会非常方便。 3.MATLAB标定&#xff08;双目标定&#xff09; MATLAB用来双目标定会非常方便&#xff0c;主要是为…

SparkSQL编程入口和模型与SparkSQL基本编程

SparkSQL编程入口和模型 SparkSQL编程模型 主要通过两种方式操作SparkSQL&#xff0c;一种就是SQL&#xff0c;另一种为DataFrame和Dataset。 1)SQL&#xff1a;SQL不用多说&#xff0c;就和Hive操作一样&#xff0c;但是需要清楚一点的是&#xff0c;SQL操作的是表&#xf…

【北京迅为】《iTOP-3588开发板从零搭建ubuntu环境手册》-第2章 获取并安装Ubuntu操作系统

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

网络编程套接字 (二)---udosocket

本专栏内容为&#xff1a;Linux学习专栏&#xff0c;分为系统和网络两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握Linux。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;网络 &#x1f69a;代码仓库&#xff1a;小小unicorn的代…

力扣每日一题-统计已测试设备-2024.5.10

力扣题目&#xff1a;统计已测试设备 题目链接: 2960.统计已测试设备 题目描述 代码思路 根据题目内容&#xff0c;第一感是根据题目模拟整个过程&#xff0c;在每一步中修改所有设备的电量百分比。但稍加思索&#xff0c;发现可以利用已测试设备的数量作为需要减少的设备电…

前端组件库图片上传时候做自定义裁剪操作

不论是vue还是react项目&#xff0c;我们在使用antd组件库做上传图片的时候&#xff0c;有一个上传图片裁剪的功能&#xff0c;但是这个功能默认是只支持1:1的裁剪操作&#xff0c;如何做到自定义的裁剪操作&#xff1f;比如显示宽高比&#xff1f;是否可以缩放和旋转操作&…