c++IO库详细介绍
文章目录
- 前言
- c++ IO 类简介
- 1. iostream库
- `iostream` 类
- 标准IO对象
- 2. fstream库
- `fstream` 类
- 3. stringstream库
- `stringstream` 类
- 格式化和控制
- 错误处理
- IO对象无拷贝或赋值
- IO条件状态
- 主要的状态标志
- 检查流状态
- 控制流状态
- 示例
- 管理输出缓冲
- 主要操作
- 示例
- 文件输入输出
- 使用文件流对象
- 示例
- 文件模式
- 示例:使用不同文件模式
- string流
- 1. `std::stringstream`
- 基本用法
- 示例
- 2. `std::istringstream`
- 基本用法
- 示例
- 3. `std::ostringstream`
- 基本用法
- 示例
- 使用场景
- 总结
- 有用的话,点个赞,加个关注啊朋友!
前言
简单分享一下c++ IO相关的一些知识点,希望对大家有用
c++ IO 类简介
C++的IO类是标准库的一部分,主要用于输入和输出操作。这些类提供了读写数据的接口,无论是从标准输入输出(如键盘和屏幕)还是从文件。以下是一些核心的C++ IO类及其主要功能:
1. iostream库
iostream库包含用于标准输入输出操作的基本类。
iostream 类
istream:用于输入操作的基类,例如从键盘读取数据。ostream:用于输出操作的基类,如向屏幕输出数据。iostream:istream和ostream的组合,用于同时支持输入和输出。
标准IO对象
std::cin:标准输入流对象,与istream类关联,通常用于从键盘读取输入。std::cout:标准输出流对象,与ostream类关联,用于向屏幕输出数据。std::cerr:标准错误流对象,也与ostream类关联,用于输出错误消息。默认情况下,cerr是非缓冲的,即立即输出。std::clog:类似于cerr,但通常用于记录日志。clog是缓冲的,所以输出可能不会立即出现。
2. fstream库
fstream库提供了文件读写功能。
fstream 类
ifstream:用于从文件读取数据的输入流类。继承自istream。ofstream:用于向文件写入数据的输出流类。继承自ostream。fstream:结合了ifstream和ofstream的功能,支持同时读写文件。继承自iostream。
3. stringstream库
sstream库提供了字符串流功能,即使用字符串进行输入输出操作。
stringstream 类
istringstream:类似于istream,但用于从字符串读取数据。ostringstream:类似于ostream,但用于向字符串写入数据。stringstream:结合了istringstream和ostringstream的功能,支持同时对字符串进行读写。
格式化和控制
C++ IO类还提供了丰富的格式化和控制功能,例如设置小数点后的位数、设置宽度、填充字符等,这些都是通过流操纵符(如 std::setprecision、std::setw 等)实现的。
错误处理
流对象内部维护着状态标志,可以用来检测操作是否成功。例如:
eof():检查是否达到文件末尾(End Of File)。fail():检查是否发生了逻辑错误,如格式不匹配。bad():检查是否发生了严重错误,如读写操作失败。
IO对象无拷贝或赋值
在C++中,IO对象(如 std::cin, std::cout, std::ifstream, std::ofstream 等)是不可拷贝和不可赋值的。这意味着不能使用拷贝构造函数或赋值操作符来复制或赋值这些对象。这样的设计是出于几个原因:
-
唯一性:每个IO对象都对应一个唯一的资源,例如标准输入、标准输出或特定的文件。允许复制这些对象可能导致对同一资源的多个访问点,这可能引发混乱和不一致性。
-
资源管理:IO对象通常与底层资源(如文件句柄)紧密绑定。拷贝IO对象可能导致资源管理问题,例如资源泄露或重复关闭文件。
-
状态共享:如果IO对象可以被拷贝,那么它们的状态(如错误状态、文件指针位置等)也将被共享。这种状态共享可能导致难以追踪的错误和不可预测的行为。
因此,为了保证资源的正确管理和使用,C++标准库设计了IO对象为不可拷贝和不可赋值。如果需要传递这些对象,通常的做法是使用引用或指针。例如,可以将 std::ostream 对象作为引用参数传递给一个函数,从而允许该函数向任何输出流(如 std::cout 或文件输出流)写入数据。
示例:
void writeToStream(std::ostream& stream) {stream << "Hello, World!";
}int main() {writeToStream(std::cout); // 使用标准输出流std::ofstream file("example.txt");writeToStream(file); // 使用文件输出流// ...
}
IO条件状态
C++标准库中的IO流(如 std::istream、std::ostream、以及从它们派生出的类型,比如 std::ifstream、std::ofstream)维护了一个内部状态,该状态表示流的当前健康状况。这个状态是通过一组状态标志来表示的,可以用来检查在执行IO操作过程中是否发生了错误。
主要的状态标志
-
eofbit:表示已经到达输入流的末尾(End-Of-File)。例如,如果你试图从文件读取数据,但已经到达文件末尾,那么这个标志会被设置。
-
failbit:表示一个IO操作失败,但不是由于到达文件末尾或发生严重错误造成的。例如,当试图读取一个整数,但输入的是一个字母时,这个标志会被设置。
-
badbit:表示发生了严重错误(如无法读取数据)。这通常意味着流不能继续使用。
-
goodbit:表示流处于良好状态,没有错误发生。其值通常为0。
检查流状态
流对象提供了一些成员函数来检查这些状态标志:
good():如果没有任何错误标志被设置(即流处于良好状态),则返回true。eof():如果设置了eofbit,则返回true。fail():如果设置了failbit或badbit,则返回true。bad():如果设置了badbit,则返回true。
控制流状态
clear():用于重置流的状态标志。你可以传递一个特定的标志位作为参数,或者不传递参数来清除所有的错误标志。setstate():用于设置特定的状态标志。
示例
#include <iostream>
#include <fstream>int main() {std::ifstream file("example.txt");if (!file) {if (file.eof()) {std::cout << "Reached end of file." << std::endl;}if (file.fail()) {std::cout << "IO operation failed." << std::endl;}if (file.bad()) {std::cout << "Critical IO error." << std::endl;}} else {// 文件读取或处理操作}file.close();return 0;
}
在这个示例中,打开一个文件进行读取,并检查文件流对象 file 是否处于良好状态。如果有错误发生,就检查是哪种类型的错误并做出相应的反应。
管理输出缓冲
主要操作
-
刷新缓冲区:将缓冲区的内容立即输出到目标设备。
- 使用
std::flush:它会刷新关联的缓冲区但不输出任何额外内容。 - 使用
std::endl:它会插入换行符并刷新缓冲区。
- 使用
-
同步与不同步I/O:
- 使用
std::ios::sync_with_stdio(false):禁用C++流和C标准I/O之间的同步,可以提高程序性能,但在混用C和C++风格的I/O时需小心。
- 使用
-
设置缓冲区大小:
- 使用
rdbuf()->pubsetbuf(char* buffer, std::streamsize buffer_size)来自定义流的缓冲区大小和位置。
- 使用
示例
#include <iostream>
#include <fstream>int main() {// 禁用同步std::ios::sync_with_stdio(false);// 使用std::flush刷新缓冲区std::cout << "Hello, World!" << std::flush;// 使用std::endl插入换行并刷新缓冲区std::cout << "Another line" << std::endl;// 使用自定义缓冲区进行文件操作char buffer[1024];std::ofstream file("example.txt");file.rdbuf()->pubsetbuf(buffer, sizeof(buffer));// ... 文件写入操作 ...// 刷新并关闭文件file << std::flush;file.close();return 0;
}
在这个示例中,使用 std::flush 和 std::endl 来管理标准输出流的缓冲区。
文件输入输出
在C++中,文件输入输出是通过文件流对象实现的,这些对象包含在标准库 <fstream> 中。主要包括三种类型的文件流对象:std::ifstream 用于文件读取,std::ofstream 用于文件写入,以及 std::fstream 既可以用于读取也可以用于写入。
使用文件流对象
-
std::ifstream(输入文件流):- 用于从文件中读取数据。
- 你可以使用成员函数
open()打开文件,或在创建对象时指定文件名。 - 使用
>>运算符或getline()函数从文件中读取数据。
-
std::ofstream(输出文件流):- 用于向文件写入数据。
- 同样,可以使用
open()方法或在构造函数中指定文件名来打开文件。 - 使用
<<运算符向文件中写入数据。
-
std::fstream(文件流):- 结合了
ifstream和ofstream的功能,可以同时用于读取和写入。 - 打开文件时,需要指定模式(如读、写或两者)。
- 结合了
示例
#include <fstream>
#include <iostream>
#include <string>int main() {// 写入文件std::ofstream outFile("test.txt");outFile << "Hello, file!" << std::endl;outFile.close();// 读取文件std::ifstream inFile("test.txt");std::string line;while (getline(inFile, line)) {std::cout << line << std::endl;}inFile.close();
}
文件模式
文件模式是指打开文件时指定的模式,它决定了如何操作文件。常见的文件模式包括:
- 输入(
std::ios::in):文件以读取模式打开。 - 输出(
std::ios::out):文件以写入模式打开。如果文件已存在,则其内容会被覆盖,除非同时使用了std::ios::app。 - 二进制(
std::ios::binary):以二进制模式打开文件。 - 追加(
std::ios::app):所有输出操作都在文件末尾进行,不覆盖文件原有内容。 - 同时读写(
std::ios::in | std::ios::out):文件同时用于读取和写入。
示例:使用不同文件模式
#include <fstream>int main() {// 以写入模式打开文件,如果文件存在,则覆盖内容std::ofstream outFile("test.txt", std::ios::out);// 以追加模式打开文件,写入的内容添加到文件末尾std::ofstream appendFile("test.txt", std::ios::app);// 以二进制和读写模式打开文件std::fstream binaryFile("test.bin", std::ios::in | std::ios::out | std::ios::binary);
}
string流
在C++中,字符串流(String Stream)提供了一种方便的方式来处理字符串数据。这些功能通过 <sstream> 头文件中的类实现,包括 std::stringstream、std::istringstream 和 std::ostringstream。
1. std::stringstream
std::stringstream 类结合了输入和输出功能,可以用于同时读取和写入字符串。它通常用于格式化字符串、从字符串解析数据,或者将多种数据类型组合成一个字符串。
基本用法
- 将数据写入字符串流。
- 从字符串流中读取数据。
- 作为动态字符串的构建器。
示例
#include <sstream>
#include <iostream>int main() {std::stringstream ss;ss << "Example " << 123 << " "; // 写入字符串和整数ss << 45.67; // 继续写入浮点数std::string str = ss.str(); // 获取整个字符串std::cout << str << std::endl; // 输出: "Example 123 45.67"int num;ss >> str >> num; // 从流中读取数据std::cout << str << ", " << num << std::endl; // 输出: "Example, 123"
}
2. std::istringstream
std::istringstream 类专门用于从字符串读取数据,类似于 std::ifstream,但操作的是字符串而非文件。
基本用法
- 从字符串解析数据。
- 类似于使用
>>运算符从std::cin读取数据。
示例
#include <sstream>
#include <iostream>int main() {std::string data = "42 Hello";std::istringstream iss(data);int num;std::string word;iss >> num >> word;std::cout << "Number: " << num << ", Word: " << word << std::endl; // 输出: "Number: 42, Word: Hello"
}
3. std::ostringstream
std::ostringstream 类专门用于向字符串写入数据,类似于 std::ofstream,但操作的是字符串而非文件。
基本用法
- 将多种数据格式化为字符串。
- 类似于使用
<<运算符向std::cout写入数据。
示例
#include <sstream>
#include <iostream>int main() {std::ostringstream oss;oss << "Number: " << 42 << ", Word: " << "Hello";std::string str = oss.str(); // 获取构建的字符串std::cout << str << std::endl; // 输出: "Number: 42, Word: Hello"
}
使用场景
- 数据的串行化和反串行化。
- 从复杂字符串中解析不同类型的数据。
- 构建复杂的格式化字符串。
- 用于单元测试中以字符串形式比较复杂对象的输出。
总结
IO这块还有很多可以深入研究的地方,同步/异步,阻塞/非阻塞等,今天简单介绍一下,后续补充详细的知识。
有用的话,点个赞,加个关注啊朋友!
相关文章:
c++IO库详细介绍
文章目录 前言c IO 类简介1. iostream库iostream 类标准IO对象 2. fstream库fstream 类 3. stringstream库stringstream 类 格式化和控制错误处理 IO对象无拷贝或赋值IO条件状态主要的状态标志检查流状态控制流状态示例 管理输出缓冲主要操作示例 文件输入输出使用文件流对象示…...
海外静态IP和动态IP有什么区别?推荐哪种?
什么是静态ip、动态ip,二者有什么区别?哪种好?关于这个问题,不难发现,在知道、知乎上面的解释有很多,但据小编的发现,这些回答都是关于静态ip和动态ip的专业术语解释,普通非专业人事…...
OpenHarmony从入门到放弃(一)
OpenHarmony从入门到放弃(二) 一、OpenHarmony的基本概念和特性 OpenHarmony是由开放原子开源基金会孵化及运营的开源项目,其目标是构建一个面向全场景、全连接、全智能的时代的智能终端设备操作系统。 分布式架构 OpenHarmony采用分布式…...
Unity3D UGUI图集打包与动态使用(TexturePacker)
制作图集的好处: 众所周知CPU是用来处理游戏的逻辑运算的,而GPU是用来处理游戏中图像的。在GPU中,我们要绘制一个图像需要提交图片(纹理)到显存,然后再进行绘制(在这个过程中会产生一次DrawCall…...
java maven项目添加oracle jdbc的依赖
一般添加依赖是直接在pom.xml中添加配置即可,Maven会自动获取对应的jar包,但是oracle驱动依赖添加后会显示红色,代表找不到依赖项,是因为Oracle授权问题,Maven3不提供Oracle JDBC driver,为了在Maven项目中…...
【UEFI基础】EDK网络框架(环境配置)
环境配置 为了能够让使用测试BIOS的QEMU与主机(就是指普通的Windows系统,我们使用它来编译BIOS和启动QEMU虚拟机)通过网络连接,需要额外的配置。 首先是下载和安装OpenVPN(这里安装的是OpenVPN-2.5.5-I601-amd64.msi…...
K8S学习指南(60)-K8S源代码走读之API-Server
文章目录 API Server 的代码结构API Server 的核心逻辑1. 请求处理流程1.1 HTTP 请求处理1.2 认证和授权1.3 API 版本处理1.4 资源路由1.5 资源处理1.6 响应生成 2. 存储层2.1 存储接口定义2.2 存储实现 二次开发扩展点1. 插件机制1.1 插件注册1.2 插件实现 2. 自定义资源定义&…...
基于深度学习的交通标志图像分类识别系统
温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 本文详细探讨了一基于深度学习的交通标志图像识别系统。采用TensorFlow和Keras框架,利用卷积神经网络(CNN)进行模型训练和预测,并引入VGG16迁移学习…...
使用uni-app editor富文本组件设置富文本内容及解决@Ready先于onload执行,无法获取后端接口数据的问题
开始使用富文本组件editor时,不知如何调用相关API设置富文本内容和获取内容,本文将举例详解 目录 一.了解editor组件的常用属性及相关API 1.属性常用说明 2.富文本相关API说明 1)editorContext 2) editorContext.setContents…...
Spring高手之路-Spring事务的传播机制(行为、特性)
目录 含义 七种事务传播机制 1.REQUIRED(默认) 2.REQUIRES_NEW 3.SUPPORTS 4.NOT_SUPPORTED 5.MANDATORY 6.NEVER 7.NESTED 含义 Spring事务的传播机制是指在多个事务方法相互调用时,如何处理这些事务的传播行为。对应七种事务传播行为…...
简易机器学习笔记(八)关于经典的图像分类问题-常见经典神经网络LeNet
前言 图像分类是根据图像的语义信息对不同类别图像进行区分,是计算机视觉的核心,是物体检测、图像分割、物体跟踪、行为分析、人脸识别等其他高层次视觉任务的基础。图像分类在许多领域都有着广泛的应用,如:安防领域的人脸识别和…...
pytest conftest通过fixture实现变量共享
conftest.py scope"module" 只对当前执行的python文件 作用 pytest.fixture(scope"module") def global_variable():my_dict {}yield my_dict test_case7.py import pytestlist1 []def test_case001(global_variable):data1 123global_variable.u…...
系列五、搭建Naco(集群版)
一、搭建Naco(集群版) 1.1、前置说明 (1)64位Red Hat7 Linux 系统; (2)64位JDK1.8;备注:如果没有安装JDK,请参考【系列二、Linux中安装JDK】 (3&…...
JavaScript中alert、prompt 和 confirm区别及使用【通俗易懂】
✨前言✨ 本篇文章主要在于,让我们看几个与用户交互的函数:alert,prompt 和confirm的使用及区别 🍒欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍒博主将持续更新学习记录收获&…...
【GoLang入门教程】Go语言几种标准库介绍(四)
编程语言的未来? 文章目录 编程语言的未来?前言几种库fmt库 (格式化操作)关键函数:示例 Go库标准库第三方库示例 html库(HTML 转义及模板系统)主要功能:示例 总结专栏集锦写在最后 前言 上一篇,我们介绍了debug、enco…...
面试算法:快速排序
题目 快速排序是一种非常高效的算法,从其名字可以看出这种排序算法最大的特点就是快。当表现良好时,快速排序的速度比其他主要对手(如归并排序)快2~3倍。 分析 快速排序的基本思想是分治法,排序过程如下…...
航空业数字化展翅高飞,开源网安专业服务保驾护航
某知名航空公司是中国首批民营航空公司之一,运营国内外航线200多条,也是国内民航最高客座率的航空公司之一。在数字化发展中,该航空公司以数据驱动决策,通过精细化管理、数字创新和模式优化等方式,实现了精准营销和个…...
SpringBoot学习(三)-员工管理系统开发(重在理解)
注:此为笔者学习狂神说SpringBoot的笔记,其中包含个人的笔记和理解,仅做学习笔记之用,更多详细资讯请出门左拐B站:狂神说!!! 本文是基于狂神老师SpringBoot教程中的员工管理系统从0到1的实践和理解。该系统应用SpringB…...
2 Windows网络编程
1 基础概念 1.1 socket概念 Socket 的原意是“插座”,在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。Socket本质上是一个抽象层,它是一组用于网络通信的API,包括了一系列…...
uniapp选择android非图片文件的方案踩坑记录
这个简单的问题我遇到下面6大坑,原始需求是选择app如android的excel然后读取到页面并上传表格数据json 先看看效果 uniapp 选择app excel文件读取 1.uniapp自带不支持 uniapp选择图片和视频非常方便自带已经支持可以直接上传和读取 但是选择word excel的时候就出现…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...
