C++的 I/O 流

本文把复杂的基类和派生类的作用和关系捋出来,具体的接口请参考相关文档

C++的 I/O 流相关的类,继承关系如下图所示

https://zh.cppreference.com/w/cpp/io

I / O 的概念:内存和外设进行数据交互称为 I / O ,例如:把数据写入磁盘,把数据显示到屏幕,把键盘的数据传到内存等等。

流的概念:可以理解为河水,有源头,有目的,按字节流动。按流传输时,不关心内容,格式,类型等等。

我们重点要掌握的是:输入输出流定义的全局对象 cout cin 等, 还有文件输入输出流,熟悉文件输入输出流相关接口。

成员变量

https://zh.cppreference.com/w/cpp/io/ios_base

我们要熟悉一下 ios_base 中维护的一些成员变量,首先就是流的打开方式

常量

解释

std::ios::app

每次写入前寻位到流结尾

std::ios::binary

以二进制模式打开

std::ios::in

为读打开

std::ios::out

为写打开

std::ios::trunc

在打开时舍弃流的内容

std::ios::ate

打开后立即寻位到流结尾

std::ios::noreplace

以独占模式打开

这里是不是有些奇怪,怎么打开流像打开文件一样?

以 Linux 系统为例,文件管理模块会把硬件设备全部抽象成文件:显示器,键盘,网卡等属于字符设备文件,存磁盘,u盘等属于块设备文件。经过虚拟文件系统对具体文件系统抽象后,上层会以统一的视角看待底层设备。

所以,这里的一层理解是:所谓的基于流的 I/O 可以理解为进程对某个文件的输入输出。比如,C++中最常用的 cin, cout, 就是对进程的0号文件描述符和1号文件描述符进行操作

文件有自己的打开方式,对应的,流也就有打开方式

视角再拉回来,ios_base 中的成员变量还有寻位相关的

常量

解释

std::ios::beg

流的开始

std::ios::end

流的结尾

std::ios::cur

流位置指示器的当前位置

还有流的状态

常量

解释

goodbit

无错误

badbit

不可恢复的流错误

failbit

输入/输出操作失败(格式化或提取错误)

eofbit

关联的输出序列已抵达文件尾


输入输出操作

std::basic_streambuf 是输入输出操作的缓冲区

https://zh.cppreference.com/w/cpp/io/basic_streambuf

std::basic_streambuf 关联的缓冲区有两类:

1. 通过操作系统的API访问的实体(文件、TCP 套接字、串行端口、其他字符设备)

2.能解读成缓冲区的对象(std::vector, std::string等)

对于输入操作来说,该缓冲区称为获取区(进程从获取区拿数据)

对于输出操作来说,该缓冲区称为放置区(进程把数据放到放置区)

std::basic_ostream 提供输出操作

https://zh.cppreference.com/w/cpp/io/basic_ostream

标准库提供六个全局 basic_ostream 对象:

在标头 <iostream> 定义

cout | wcout

写入到标准 C 输出流 stdout (全局对象)

cerr | wcerr

写入到标准 C 错误流 stderr,无缓冲 (全局对象)

clog | wclog

写入到标准 C 错误流 stderr (全局对象)

std::basic_istream 提供输入操作

https://zh.cppreference.com/w/cpp/io/basic_istream

标准库提供两个全局 basic_istream 对象:

在标头 <iostream> 定义

cin | wcin

从标准 C 输入流 stdin 读取 (全局对象)

std::basic_iostream 继承了std::basic_ostream 和 std::basic_istream ,提供输入输出操作。
https://zh.cppreference.com/w/cpp/io/basic_iostream

为了理解 std::basic_streambuf std::basic_ostream std::basic_istream 我们看如下程序,下面程序中 MyStreamBuf 是自定义的缓冲区, 封装 std::string 对象。MyStreamBuf 继承了 std::streambuf 可以重写 std::streambuf 的虚函数,std::ostream 接受一个缓冲区 MyStreamBuf 作为参数实例化对象。

注:std::ostream , std::streambuf 是 std::basic_ostream , std::basic_streambuf 的别名

下面封装缓冲区是 重写 overflow 和 xsputn 两个虚函数,可以参考std::streambuf文档

#include <iostream>
#include <streambuf>
#include <string>// 自定义流缓冲区:将输出内容存储到字符串
class MyStreamBuf : public std::streambuf {
protected:std::string buffer_;// 处理单个字符输出virtual int_type overflow(int_type c) override {if (c != traits_type::eof()) {buffer_ += traits_type::to_char_type(c);}return c;}// 处理多字符输出virtual std::streamsize xsputn(const char* s, std::streamsize n) override {buffer_.append(s, n);return n;}public:const std::string& getBuffer() const { return buffer_; }
};int main() {MyStreamBuf buf; // 实例化自定义流缓冲区std::ostream myStream(&buf); // 构造ostream,使用自定义缓冲区myStream << "Hello World! " << 42 << std::endl; // 输出到流// 获取并打印缓冲区内容std::cout << "输出流里的内容是: " << buf.getBuffer();return 0;
}

文件的输入输出流

下面我们介绍 std::basic_fstream 。 std::basic_fstream 继承关系如下所示

基类我们前文已经介绍了,ios_base 维护必要的变量, basic_istream 提供输入操作, basic_ostream 提供输出操作。

std::basic_fstream 作为派生类,添加了一些文件相关的接口,可以参考文档

https://zh.cppreference.com/w/cpp/io/basic_fstream

下面写一个小程序,可以拷贝图片或视频

#include <iostream>
#include <fstream>
using namespace std;
int main() {// 打开源文件(二进制模式)fstream inFile("C:\\Users\\34497\\Desktop\\屏幕录制 2025-01-15 213832.mp4", ios::in | ios::binary);  if (!inFile) {cerr << "无法打开源文件" << endl;return 1;}// 创建目标文件(二进制模式并清空内容)fstream outFile("C:\\Users\\34497\\Desktop\\destination.mp4", ios::out | ios::binary | ios::trunc);        if (!outFile) {cerr << "无法创建目标文件" << endl;inFile.close();return 1;}// 使用缓冲区提高读写效率const int BUFFER_SIZE = 4096;char buffer[BUFFER_SIZE];// 循环读写文件内容while (inFile.read(buffer, BUFFER_SIZE)) {outFile.write(buffer, inFile.gcount());}// 处理最后一次读取的数据if (inFile.eof()) {// 写入剩余的有效数据outFile.write(buffer, inFile.gcount());}else {// 非EOF错误处理cerr << "文件读取过程中发生错误" << endl;inFile.close();outFile.close();return 1;}// 关闭文件流inFile.close();outFile.close();cout << "拷贝完成!" << endl;   return 0;
}

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

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

相关文章

【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 常见组件(一)

目录 1 -> List 1.1 -> 创建List组件 1.2 -> 添加滚动条 1.3 -> 添加侧边索引栏 1.4 -> 实现列表折叠和展开 1.5 -> 场景示例 2 -> dialog 2.1 -> 创建Dialog组件 2.2 -> 设置弹窗响应 2.3 -> 场景示例 3 -> form 3.1 -> 创建…

《Python预训练视觉和大语言模型》:从DeepSeek到大模型实战的全栈指南

就是当代AI工程师的日常&#xff1a;* - 砸钱买算力&#xff0c;却卡在分布式训练的“隐形坑”里&#xff1b; - 跟着论文复现模型&#xff0c;结果连1/10的性能都达不到&#xff1b; - 好不容易上线应用&#xff0c;却因伦理问题被用户投诉…… 当所有人都在教你怎么调用…

【Elasticsearch】date range聚合

好的&#xff0c;继续之前的示例&#xff1a; json ] } } } } 4.3 自定义键&#xff08;key&#xff09; 通过为每个范围指定一个唯一的键&#xff08;key&#xff09;&#xff0c;可以在结果中更方便地引用每个范围。这在使用keyed参数将结果以键值对形式返回时尤其有用。 j…

ElasticSearch 学习课程入门(二)

引子 前文已经介绍了ES的增删改查基本操作&#xff0c;接下来&#xff0c;我们学习下高级点的用法。OK&#xff0c;那就让我们开始吧。 一、ES高级操作 1、条件查询 &#xff08;1&#xff09;GET https://127.0.0.1:9200/shopping/_search?qcategory:小米 &#xff08;2&…

6.PPT:魏女士-高新技术企业政策【19】

目录 NO1234​ NO567 ​ NO1234 创建“PPT.pptx”考生文件夹Word素材文档&#xff1a;选中对应颜色的文字→选中对应的样式单击右键按下匹配对应文字&#xff1a;应用所有对应颜色的文字开始→创建新的幻灯片→从大纲&#xff1a;考生文件夹&#xff1a;Word素材重置 开始→版…

【Linux系统】信号:信号保存 / 信号处理、内核态 / 用户态、操作系统运行原理(中断)

理解Linux系统内进程信号的整个流程可分为&#xff1a; 信号产生 信号保存 信号处理 上篇文章重点讲解了 信号的产生&#xff0c;本文会讲解信号的保存和信号处理相关的概念和操作&#xff1a; 两种信号默认处理 1、信号处理之忽略 ::signal(2, SIG_IGN); // ignore: 忽略#…

【算法篇】贪心算法

目录 贪心算法 贪心算法实际应用 一&#xff0c;零钱找回问题 二&#xff0c;活动选择问题 三&#xff0c;分数背包问题 将数组和减半的最小操作次数 最大数 贪心算法 贪心算法&#xff0c;是一种在每一步选择中都采取当前状态下的最优策略&#xff0c;期望得到全局最优…

SSM网上球鞋竞拍系统

&#x1f345;点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345; 项目视频 js…

基于springboot河南省旅游管理系统

基于Spring Boot的河南省旅游管理系统是一种专为河南省旅游行业设计的信息管理系统&#xff0c;旨在整合和管理河南省的旅游资源信息&#xff0c;为游客提供准确、全面的旅游攻略和服务。以下是对该系统的详细介绍&#xff1a; 一、系统背景与意义 河南省作为中国的中部省份&…

人工智能|本地部署|ollama+chatbox快速Windows10下部署(初级篇)

一、 前言&#xff1a; 其实早一个月我已经使用过deepseek&#xff0c;并且也在自己的机器上通过ollama部署过&#xff0c;但一直没有太多动力&#xff0c;现在感觉还是的记录一下&#xff0c;省的自己给忘掉了 本文只是简单记录一下ollamaopen-webuichatbox部署通过网盘分享…

ZZNUOJ(C/C++)基础练习1061——1070(详解版)

目录 1061 : 顺序输出各位数字 C语言版 C版 1062 : 最大公约数 C C 1063 : 最大公约与最小公倍 C C 1064 : 加密字符 C C 1065 : 统计数字字符的个数 C C 1066 : 字符分类统计 C C 1067 : 有问题的里程表 C C 1068 : 进制转换 C C C&#xff08;容器stack…

记录一下 在Mac下用pyinstallter 打包 Django项目

安装: pip install pyinstaller 在urls.py from SheepMasterOneToOne import settings from django.conf.urls.static import staticurlpatterns [path("admin/", admin.site.urls),path(generate_report/export/, ReportAdmin(models.Report, admin.site).generat…

使用Python和TensorFlow/Keras构建一个简单的CNN模型来识别手写数字

一个简单的图像识别项目代码示例,使用Python和TensorFlow/Keras库来训练一个基本的CNN模型,用于识别MNIST手写数字数据集,并将测试结果输出到HTML。 代码运行效果截图: 具体操作步骤: 1. 安装所需的库 首先,确保你已经安装了所需的Python库: pip install tensorflow…

2021.3.1的android studio版本就很好用

使用最新版的studio有个问题就是gradle版本也比较高&#xff0c;这样就容易出现之前项目不兼容问题&#xff0c;配置gradle可能会出现很多问题比较烦&#xff0c;所以干脆就用老版本的studio

控件【QT】

文章目录 控件QWidgetenabledgeometrysetGeometry qrcwindowOpacityQPixmapfonttoolTipfocusPolicystyleSheetQPushButtonRadio ButtionCheck Box显示类控件QProgressBarcalendarWidget 控件 Qt中已经提供了很多内置的控件了(按钮,文本框,单选按钮,复选按钮&#xff0c;下拉框…

【小鱼闪闪】做一个物联网控制小灯的制作流程简要介绍(图文)

1、注册物联网云平台&#xff0c;这里选用巴法云 2.、新建主题 “ledtest” 3、 使用Arduino或Mixly软件编写单片机程序&#xff08;需要引用巴法云库文件&#xff09;&#xff0c;程序中订阅“ledtest”主题&#xff0c;用于接收单片机发送来的数据。此处会将连接的温度传感器…

KNN算法:从思想到实现(附代码)

引言 K最近邻算法&#xff08;K Nearest Neighbors, KNN&#xff09;是一种简单而有效的机器学习算法&#xff0c;用于分类和回归问题。其核心思想基于“近朱者赤&#xff0c;近墨者黑”&#xff0c;即通过测量不同特征值之间的距离来进行分类或预测数值。本文将详细介绍KNN的…

专业学习|一文了解并实操自适应大邻域搜索(讲解代码)

一、自适应大邻域搜索概念介绍 自适应大邻域搜索&#xff08;Adaptive Large Neighborhood Search&#xff0c;ALNS&#xff09;是一种用于解决组合优化问题的元启发式算法。以下是关于它的详细介绍&#xff1a; -自适应大领域搜索的核心思想是&#xff1a;破坏解、修复解、动…

TensorFlow深度学习实战(6)——回归分析详解

TensorFlow深度学习实战&#xff08;6&#xff09;——回归分析详解 0. 前言1. 回归分析简介2. 线性回归2.1 简单线性回归2.2 多重线性回归2.3 多元线性回归 3. 构建基于线性回归的神经网络3.1 使用 TensorFlow 进行简单线性回归3.2 使用 TensorFlow 进行多元线性回归和多重线性…

2024年12月 Scratch 图形化(二级)真题解析 中国电子学会全国青少年软件编程等级考试

202412 Scratch 图形化&#xff08;二级&#xff09;真题解析 中国电子学会全国青少年软件编程等级考试 一、单选题(共25题&#xff0c;共50分) 第 1 题 小猫初始位置和方向如下图所示&#xff0c;下面哪个选项能让小猫吃到老鼠&#xff1f;&#xff08; &#xff09; A. B. …