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:用于输出操作的基类,如向屏幕输出数据。
  • iostreamistreamostream 的组合,用于同时支持输入和输出。
标准IO对象
  • std::cin:标准输入流对象,与 istream 类关联,通常用于从键盘读取输入。
  • std::cout:标准输出流对象,与 ostream 类关联,用于向屏幕输出数据。
  • std::cerr:标准错误流对象,也与 ostream 类关联,用于输出错误消息。默认情况下,cerr 是非缓冲的,即立即输出。
  • std::clog:类似于 cerr,但通常用于记录日志。clog 是缓冲的,所以输出可能不会立即出现。

2. fstream库

fstream库提供了文件读写功能。

fstream
  • ifstream:用于从文件读取数据的输入流类。继承自 istream
  • ofstream:用于向文件写入数据的输出流类。继承自 ostream
  • fstream:结合了 ifstreamofstream 的功能,支持同时读写文件。继承自 iostream

3. stringstream库

sstream库提供了字符串流功能,即使用字符串进行输入输出操作。

stringstream
  • istringstream:类似于 istream,但用于从字符串读取数据。
  • ostringstream:类似于 ostream,但用于向字符串写入数据。
  • stringstream:结合了 istringstreamostringstream 的功能,支持同时对字符串进行读写。

格式化和控制

C++ IO类还提供了丰富的格式化和控制功能,例如设置小数点后的位数、设置宽度、填充字符等,这些都是通过流操纵符(如 std::setprecisionstd::setw 等)实现的。

错误处理

流对象内部维护着状态标志,可以用来检测操作是否成功。例如:

  • eof():检查是否达到文件末尾(End Of File)。
  • fail():检查是否发生了逻辑错误,如格式不匹配。
  • bad():检查是否发生了严重错误,如读写操作失败。

IO对象无拷贝或赋值

在C++中,IO对象(如 std::cin, std::cout, std::ifstream, std::ofstream 等)是不可拷贝和不可赋值的。这意味着不能使用拷贝构造函数或赋值操作符来复制或赋值这些对象。这样的设计是出于几个原因:

  1. 唯一性:每个IO对象都对应一个唯一的资源,例如标准输入、标准输出或特定的文件。允许复制这些对象可能导致对同一资源的多个访问点,这可能引发混乱和不一致性。

  2. 资源管理:IO对象通常与底层资源(如文件句柄)紧密绑定。拷贝IO对象可能导致资源管理问题,例如资源泄露或重复关闭文件。

  3. 状态共享:如果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::istreamstd::ostream、以及从它们派生出的类型,比如 std::ifstreamstd::ofstream)维护了一个内部状态,该状态表示流的当前健康状况。这个状态是通过一组状态标志来表示的,可以用来检查在执行IO操作过程中是否发生了错误。

主要的状态标志

  1. eofbit:表示已经到达输入流的末尾(End-Of-File)。例如,如果你试图从文件读取数据,但已经到达文件末尾,那么这个标志会被设置。

  2. failbit:表示一个IO操作失败,但不是由于到达文件末尾或发生严重错误造成的。例如,当试图读取一个整数,但输入的是一个字母时,这个标志会被设置。

  3. badbit:表示发生了严重错误(如无法读取数据)。这通常意味着流不能继续使用。

  4. goodbit:表示流处于良好状态,没有错误发生。其值通常为0。

检查流状态

流对象提供了一些成员函数来检查这些状态标志:

  • good():如果没有任何错误标志被设置(即流处于良好状态),则返回 true
  • eof():如果设置了 eofbit,则返回 true
  • fail():如果设置了 failbitbadbit,则返回 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 是否处于良好状态。如果有错误发生,就检查是哪种类型的错误并做出相应的反应。

管理输出缓冲

主要操作

  1. 刷新缓冲区:将缓冲区的内容立即输出到目标设备。

    • 使用 std::flush:它会刷新关联的缓冲区但不输出任何额外内容。
    • 使用 std::endl:它会插入换行符并刷新缓冲区。
  2. 同步与不同步I/O

    • 使用 std::ios::sync_with_stdio(false):禁用C++流和C标准I/O之间的同步,可以提高程序性能,但在混用C和C++风格的I/O时需小心。
  3. 设置缓冲区大小

    • 使用 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::flushstd::endl 来管理标准输出流的缓冲区。

文件输入输出

在C++中,文件输入输出是通过文件流对象实现的,这些对象包含在标准库 <fstream> 中。主要包括三种类型的文件流对象:std::ifstream 用于文件读取,std::ofstream 用于文件写入,以及 std::fstream 既可以用于读取也可以用于写入。

使用文件流对象
  1. std::ifstream(输入文件流)

    • 用于从文件中读取数据。
    • 你可以使用成员函数 open() 打开文件,或在创建对象时指定文件名。
    • 使用 >> 运算符或 getline() 函数从文件中读取数据。
  2. std::ofstream(输出文件流)

    • 用于向文件写入数据。
    • 同样,可以使用 open() 方法或在构造函数中指定文件名来打开文件。
    • 使用 << 运算符向文件中写入数据。
  3. std::fstream(文件流)

    • 结合了 ifstreamofstream 的功能,可以同时用于读取和写入。
    • 打开文件时,需要指定模式(如读、写或两者)。
示例
#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();
}
文件模式

文件模式是指打开文件时指定的模式,它决定了如何操作文件。常见的文件模式包括:

  1. 输入(std::ios::in:文件以读取模式打开。
  2. 输出(std::ios::out:文件以写入模式打开。如果文件已存在,则其内容会被覆盖,除非同时使用了 std::ios::app
  3. 二进制(std::ios::binary:以二进制模式打开文件。
  4. 追加(std::ios::app:所有输出操作都在文件末尾进行,不覆盖文件原有内容。
  5. 同时读写(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::stringstreamstd::istringstreamstd::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这块还有很多可以深入研究的地方,同步/异步,阻塞/非阻塞等,今天简单介绍一下,后续补充详细的知识。

有用的话,点个赞,加个关注啊朋友!

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

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

相关文章

uniCloud 云数据库(新建表、增、删、改、查)

新建表结构描述文件 todo 为自定义的表名 表结构描述文件的默认后缀为 .schema.json 设置表的操作权限 uniCloud-aliyun/database/todo.schema.json 默认的操作权限都是 false "permission": {"read": false,"create": false,"update&quo…

html中的form表单以及相关控件input、文本域、下拉select等等的详细解释 ,点赞加关注持续更新~

文章目录 表单创建表单forminput 标签input标签的value属性设置input标签格式单选框多选框上传文件下拉菜单文本域设置文本域格式label 标签按钮 表单 作用&#xff1a;收集用户信息。 使用场景&#xff1a; 登录页面注册页面搜索区域 创建表单form <form action".…

DataGear 4.7.0 发布,数据可视化分析平台

DataGear专业版 1.0.0 正式发布&#xff0c;欢迎试用&#xff01; http://datagear.tech/pro/ DataGear 4.7.0 发布&#xff0c;严重漏洞和BUG修复&#xff0c;具体更新内容如下&#xff1a; 新增&#xff1a;HTTP数据集新增【编码请求地址】支持&#xff0c;可用于解决请求…

希亦、觉飞、小吉三款婴儿洗衣机大比拼!全方位对比测评

由于年龄幼小的婴儿的皮肤都非常的幼嫩&#xff0c;因此婴儿衣物材质的类型大部分都是采用为纯棉&#xff0c;并且婴儿的衣物不能够与大人的衣物一起进行混洗&#xff0c;容易把细菌感染到宝宝的衣物上&#xff0c;因此很多家庭为了保证宝宝衣服的有效清洁&#xff0c;避免交叉…

TXT文本删除第一行文本变成空要如何解决呢

首先大家一起来看下这个TXT文本里面有多行内容&#xff0c;想把开头第一行批量删除不要掉。 1..如果是一两个本可以手动删除也很方便哦&#xff0c;如果文本量比较大如几十几、几百个文本大家一直都选用《首助编辑高手》工具去批量操作哦。批量操作可以大大提高工作效率。接来看…

AI实景无人直播创业项目:开启自动直播新时代,一部手机即可实现财富增长

在当今社会&#xff0c;直播已经成为了人们日常生活中不可或缺的一部分。无论是商家推广产品、明星互动粉丝还是普通人分享生活&#xff0c;直播已经渗透到了各行各业。然而&#xff0c;传统直播方式存在着一些不足之处&#xff0c;如需现场主持人操作、高昂的费用等。近年来&a…

Minitab 各版本安装指南

Minitab下载链接 https://pan.baidu.com/s/1PLqocknkoRGGI9lbV3e45A?pwd0531 1.鼠标右击【Minitab 21(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;选择【解压到 Minitab 21(64bit)】。 2.打开解压后的文件夹&#xff0c;鼠标右击【setu…

MacOS - 苹果电脑程序还能正常启动,但图标消失不见了~

问题描述 网上有一些解决方案说是 killall Finder 命令&#xff0c;重置 Docker 等等&#xff0c;但是发现还是不行&#xff0c;于是必杀技…… 解决方案 方案一、删除该 App&#xff0c;重装即可方案二、如果懒得重装&#xff0c;可以在 Finder 中找到对应的应用程序&#xf…

MongoDB主从仲裁模式安装

MongoDB主从仲裁模式安装 环境介绍 操作系统 &#xff1a; CentOS release 6.8 (Final) Master IP &#xff1a; 10.4.19.83 Arbiter IP &#xff1a; 10.104.27.126 Slave IP &#xff1a; 10.104.27.126 安装文件 &#xff1a; mongodb-linux-x86_64-rhel62-4.4.9.tgz …

如何把照片多余的地方擦除?一键消除图片上的瑕疵,简单又轻松,太方便了

在数字繁荣的时代&#xff0c;图片处理已然成为我们生活乐章中不可或缺的一部分&#xff0c;就如画师手中的画笔般灵动&#xff0c;摄影师镜头下的世界般多彩。然而&#xff0c;在捕捉或获取这些美丽的图片时&#xff0c;可能会不小心闯入一些不速之客&#xff0c;给画面带来瑕…

听GPT 讲Rust源代码--compiler(3)

File: rust/compiler/rustc_codegen_cranelift/src/value_and_place.rs 在Rust的编译器源代码中&#xff0c;rust/compiler/rustc_codegen_cranelift/src/value_and_place.rs文件扮演着重要的角色。它包含了与值和位置&#xff08;Place&#xff09;相关的实现和结构体定义&…

非常不错的SSH工具

Tabby 官网地址&#xff1a; Tabby - a terminal for a more modern age GitHub地址&#xff1a; GitHub - Eugeny/tabby: A terminal for a more modern age 使用说明&#xff1a; Xterminal 使用说明地址&#xff1a; 一款颜值、功能都很能打的 SSH 工具 官方地址&…

SpingBoot的项目实战--模拟电商【4.订单及订单详情的生成】

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于SpringBoot电商项目的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.功能需求 二.代码编写 …

数据库:园林题库软件(《园林建筑设计》答题卷二 )

《园林建筑设计》答题卷二 一、单项选择题 1、欧美园林的起源可以上溯到&#xff08;古埃及和古希腊&#xff09;。 2、&#xff08;京都龙安寺石庭 &#xff09;是日本枯山水的代表。 3、下列选项中&#xff08;佛香阁&#xff09;是颐和园的构图主体和重心。 4、清代北方…

求职开挂-用Chatgpt回答面试官的提问和帮助写代码可行不?

如果戴个谷歌眼镜去面试&#xff0c;直接AI扫问题得到答案&#xff0c;算不算作弊&#xff1f; 如果未来公司面试题目都连网&#xff0c;大家用力扣刷题之类学会做了&#xff0c;找工作工资多拿个20%&#xff0c;多个3-5000一个月不是很美&#xff1f; 最近的电视剧《鸣龙少年…

拓展:vue 父组件调用子组件方法ref(且父组件可通过ref调用的方法传值给子组件)

1、ref被用来给元素或子组件注册引用信息。引用信息将会注册在父组件的$refs对象上 //一、ref被用来给元素或子组件注册引用信息。引用信息将会注册在父组件的$refs对象上<div class="formBtn fl" @click="setBtn(4)">111</div> <div clas…

数据结构—环形缓冲区

写在前面&#xff0c;2023年11月开始进入岗位&#xff0c;工作岗位是嵌入式软件工程师。2024年是上班的第一年的&#xff0c;希望今年收获满满&#xff0c;增长见闻。 数据结构—环形缓冲区 为什么要使用环形数组&#xff0c;环形数组比起原来的常规数组的优势是什么&#xf…

mysql的读写分离

MySQL 读写分离原理 读写分离就是只在主服务器上写&#xff0c;只在从服务器上读。 主数据库处理事务性操作&#xff0c;而从数据库处理 select 查询。 数据库复制被用来把主数据库上事务性操作导致的变更同步到集群中的从数据库。 常见的mysql读写分离分为以下两种 1&…

CMake入门教程【核心篇】添加库(add_library)

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「本文的内容」&#xff1a;CMake入门教程 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&#x1f4dd; 文章目录 1. 基本用法2.STATIC…

印刷企业如何快速上线MES管理系统解决方案

随着科技的不断发展&#xff0c;印刷行业正面临着前所未有的挑战与机遇。为了提高生产效率、降低成本、提升企业竞争力&#xff0c;许多印刷企业开始引入MES管理系统解决方案。然而&#xff0c;对于很多企业来说&#xff0c;如何快速、有效地上线MES管理系统却是一个难题。本文…