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的时候就出现…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
