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的时候就出现…...
AI大模型入门指南:泛化、通用、涌现三大特征解析,小白也能学会收藏!
本文深入浅出地介绍了AI大模型的主要特征,包括泛化性、通用性和涌现性,并以ChatGPT为例,阐述了其如何通过巨量参数和深度网络结构展现强大的自然语言理解和生成能力。文章还详细分类并介绍了云侧大模型(如通用大模型和行业大模型&…...
实战指南:基于快马平台快速开发树莓派远程视频监控系统
最近在折腾树莓派,想做个简单的远程监控系统。之前总卡在环境配置和代码调试上,后来发现用InsCode(快马)平台可以快速生成可运行的项目骨架,省去了不少麻烦。这里分享下我的实现过程: 硬件准备 树莓派4B搭配官方摄像头模块是最基础…...
从零开始学习C++ -- 基础知识
C入门基础1.C的第一个程序2.命名空间2.1 namespace的价值2.2 namespace的定义2.3命名空间使用3.C输入&输出4.缺省参数5.函数重载6.引用6.1引用的概念和定义6.2引用的特性6.3引用的使用6.4const引用6.5指针和引用的关系7.inline8.nullptr1.C的第一个程序 #include <iost…...
破解企业AI应用开发困境:Dify工作流架构的颠覆性价值
破解企业AI应用开发困境:Dify工作流架构的颠覆性价值 【免费下载链接】Awesome-Dify-Workflow 分享一些好用的 Dify DSL 工作流程,自用、学习两相宜。 Sharing some Dify workflows. 项目地址: https://gitcode.com/GitHub_Trending/aw/Awesome-Dify-W…...
Qwen2.5-VL-7B-Instruct应用场景:法律合同关键条款图文定位与摘要生成
Qwen2.5-VL-7B-Instruct应用场景:法律合同关键条款图文定位与摘要生成 想象一下,你是一位法务人员或商务经理,面前摆着一份几十页、图文并茂的复杂合同。你需要快速找到关于“违约责任”、“付款条件”或“知识产权归属”的关键条款。传统的…...
Cadence Virtuoso IC618版图验证全流程:解决PEX提参map error的详细步骤
Cadence Virtuoso IC618版图验证全流程:解决PEX提参map error的详细步骤 从IC514迁移到IC618的过程就像给老房子换新地基——表面上看功能相似,但底层架构的升级带来了全新的操作逻辑和隐藏的"陷阱"。最近三个月,我团队完成了7个项…...
【Mojo+Python混合部署失效真相】:92%开发者忽略的编译期符号冲突、运行时上下文隔离与调试断点丢失问题
第一章:MojoPython混合部署失效真相全景概览Mojo 作为新兴的高性能系统编程语言,设计初衷是与 Python 生态无缝互操作;然而在真实生产部署中,“Mojo Python 混合部署”常出现静默失败、ABI 不兼容、运行时崩溃或性能断崖式下降等…...
MIPI D-PHY v1.2升级指南:如何利用HS-Deskew提升2.5Gbps传输稳定性
MIPI D-PHY v1.2升级指南:如何利用HS-Deskew提升2.5Gbps传输稳定性 在嵌入式系统设计中,高速串行接口的稳定性往往成为项目成败的关键。当MIPI联盟推出D-PHY v1.2规范时,最引人注目的变化莫过于将单通道传输速率从1.5Gbps提升至2.5Gbps——这…...
Gemma-3-12b-it实战教程:极简UI背后隐藏的12B模型内存映射优化策略
Gemma-3-12b-it实战教程:极简UI背后隐藏的12B模型内存映射优化策略 1. 项目概述 Gemma-3-12b-it是一款基于Google Gemma-3-12b-it大模型开发的本地多模态交互工具。这款工具针对12B大模型进行了全维度的CUDA性能优化,支持图片上传和文本提问的流式生成…...
HFSS建模进阶:如何高效使用布尔运算和局部坐标系(实战案例解析)
HFSS建模进阶:布尔运算与局部坐标系的高效实战指南 在微波器件和天线设计的数字世界里,精确的三维建模往往是成功仿真的第一步。当您已经掌握了HFSS的基础建模操作后,如何将建模效率提升到专业水平?本文将带您深入探索两个常被忽视…...
