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的时候就出现…...
前端发开的性能优化 请求级:请求前(资源预加载和预读取)
预加载 预加载:是优化网页性能的重要技术,其目的就是在页面加载过程中先提前请求和获取相关的资源信息,减少用户的等待时间,提高用户的体验性。预加载的操作可以尝试去解决一些类似于减少首次内容渲染的时间,提升关键资…...
B01、类加载子系统-02
JVM架构图-英文版 中文版见下图: 1、概述类的加载器及类加载过程 1.1、类加载子系统的作用 类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engi…...
用PHP搭建一个绘画API
【腾讯云AI绘画】用PHP搭建一个绘画API 大家好!今天我要给大家推荐的是如何用PHP搭建一个绘画API,让你的网站或应用瞬间拥有强大的绘画能力!无论你是想要让用户在网页上绘制自己的创意,还是想要实现自动绘画生成特效,这…...
西安人民检察院 | OLED翻页查询一体机
产品:55寸OLED柔性屏 项目时间:2023年12月 项目地点:西安 在2023年12月,西安人民检察院引入了OLED翻页查询一体机,为来访者提供了一种全新的信息查询方式。 这款一体机采用55寸OLED柔性屏,具有高清晰度、…...
superset利用mysql物化视图解决不同数据授权需要写好几次中文别名的问题
背景 在使用superset时,给不同的人授权不同的数据,需要不同的数据源,可视化字段希望是中文,所以导致不同的人需要都需要去改表的字段,因此引入视图,将视图中字段名称设置为中文 原表数据 select * from …...
输入输出流
1.输入输出流 输入/输出流类:iostream---------i input(输入) o output(输出) stream:流 iostream: istream类:输入流类-------------cin:输入流类的对象 ostream类…...
IOS:Safari无法播放MP4(H.264编码)
一、问题描述 MP4使用H.264编码通常具有良好的兼容性,因为H.264是一种广泛支持的视频编码标准。它可以在许多设备和平台上播放,包括电脑、移动设备和流媒体设备。 使用caniuse查询H.264兼容性,看似确实具有良好的兼容性: 然而…...
Pycharm恢复默认设置
window 系统 找到下方目录-->删除. 再重新打开Pycharm C:\Users\Administrator\.PyCharm2023.3 你的不一定和我名称一样 只要是.PyCharm*因为版本不同后缀可能不一样 mac 系统 请根据需要删除下方目录 # Configuration rm -rf ~/Library/Preferences/PyCharm* # Caches …...
简单计算器实现,包括两个数
正在加载中... 简单计算器实现,包括两个数 ❤ 厾罗 简单计算器实现,包括两个数 以下代码用于实现简单计算器实现,包括两个数基本的加减乘除运算: 实例(Python 3.0) # Filename : test.py # author by : www.dida100.com …...
竞赛保研 基于机器视觉的手势检测和识别算法
0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的手势检测与识别算法 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng…...
网站开发对企业的关键/百度关键词搜索热度
2019独角兽企业重金招聘Python工程师标准>>> 序言 摘要: 最近一直在写一个脚本语言,主要对标对象是润乾的集算器、Python等。感觉润乾的集算器有一定的应用场景,但是类似excel的方式严重影响编程可接受程度,另外其有些语法感觉与j…...
中国建设银行邀约提额网站/扬州百度推广公司
1、查找某条数据的创建时间同个月内的所有数据 SELECT * FROM 表名 WHERE DATE_FORMAT( create_time, %Y%m ) DATE_FORMAT( 2021-01-01 , %Y%m ) create_time:表里表示创建时间的字段名 2021-01-01 :选择的某条数据创建时间的年月日 2、使用select…...
学校网站系统破解版/推广app用什么平台比较好
作者 | kbsc13来源 | 机器学习与计算机视觉(ID:AI_Developer)上周结束了如何构造一个机器学习项目的系列文章,当然还有一篇简单的总结以及介绍一些入门的学习资料,不过还在整理,应该这周内会整理好的。现在…...
江苏省建设工人考勤网站/cms系统
在接口的地方加上请求头。//跨域请求header(Access-Control-Allow-Origin:*);不要在ajax里面加!!!!!!!!!转载于:https://www.cnblogs.com/lyc94620/p/9112529.html...
自己做的网站如何让别的网可以查看/温州seo优化
没怎么用过这个新特性。事实上也不算新啦,试试吧,如今静态类的继承非常方便了 <?php class A {protected static $def 123456;public static function test() {echo get_class(new static);}public static function test2() {echo static::$def;} }…...
手机凡客网/优化电池充电什么意思
原文地址:php代码审计之函数缺陷syst1m.comin_array函数缺陷Wish ListCodeclass Challenge {const UPLOAD_DIRECTORY ./solutions/;private $file;private $whitelist;public function __construct($file) {$this->file $file;$this->whitelist range(1,…...