c++IO类

概述

c++不直接处理输入输出,而是通过定义在标准类库中的类来处理IO。这些类支持从设备读取数据,向设备写入数据的IO操作,设备可以是文件、控制台窗口等。还可以从内存IO。


IO类

  • iostream:
    1. istream,wistream
    2. ostream,wostream
    3. iostream,wiostream
  • ftream:
    1. iftream, wifstream
    2. oftream, wofstream
    3. fstream, wfstream
  • sstream:
    1. istringstream, wistream
    2. ostringstream, wostringstream
    3. stringstream, wstringstream

前缀w是处理宽字符的版本。

标准库使我们能够忽略不同流之间的差异,这是通过继承机制实现的。iftreamistringstream都继承自istream对象。类似的ofstreamostringstream都继承自ostream


IO对象无拷贝或赋值

在之前的博文中说过,IO对象是不可以拷贝或赋值的。所以我们不能将形参或返回值的类型设置为流类型。进行IO的函数通常以引用的方式传递和返回流。读写IO通常会改变对象的状态,所以传递和返回的引用通常不是const的。

ofstream out1, out2;
out1 = out2; //错误,不能对流对象赋值
oftream print(ofstream); //错误,不能初始化ofstream参数
out2 = print(out2); //错误,不能拷贝流对象

条件状态

IO操作可能会发生错误,一些错误是可以恢复的。下表列出了IO类定义的一些函数和标志,可以帮助我们访问和操纵流的条件状态

流状态标志位

状态标志值(二进制)说明
goodbit000流状态正常,没有错误
eofbit001到达文件末尾(End Of File)
failbit010发生可恢复错误(如类型不匹配)
badbit100发生严重错误(如流损坏)

流状态查询函数

函数返回值说明
s.eof()bool如果设置了eofbit则返回true
s.fail()bool如果设置了failbitbadbit则返回true
s.bad()bool如果设置了badbit则返回true
s.good()bool如果流状态正常(所有错误位未设置)则返回true
s.rdstate()iostate返回流的当前状态值

流状态操作函数

函数参数说明
s.clear()重置所有错误标志,将流状态设置为goodbit
s.clear(flags)iostate将流状态设置为指定值
s.setstate(flags)iostate添加指定的状态标志

一个流一旦发生错误,其上后续的IO操纵都会失败。只有当一个流处于无错误的状态时,我们才可以从中读取数据,或向它写入数据。我们应该在使用一个流之前检查它是否处于良好状态。

while (cin >> word)//ok:读操作成功

我们也可以查询流的状态。IO库中定义了一个与机器无关的类型iostate,它提供了表达流状态的完整功能。使用goodfailbad等函数确定流的错误状态。

通过使用rdstatesetstateclear来管理条件状态。

接下来给出一个示例,用于从一个istream对象中读取数据,并将数据打印在控制台中:

#include <iostream>
#include <string>std::istream& readAndPrint(std::istream& is) {std::string word;while (is >> word) {  // 读取直到文件结束std::cout << word << " ";  // 打印读取的内容}std::cout << std::endl;is.clear();  // 复位流状态return is;
}

管理输出缓冲

每个输出流都管理一个缓冲区,用来保存程序读写的数据。考虑如下代码:

os << "please enter a value: ";

字符串可能不会立即被显示出来,而是被操作系统保存在缓冲区中,随后再打印。有了缓冲区机制,操作系统就可以把多个输出操作合并为单一的系统极写操作,这将极大地提升程序地性能。

缓冲区刷新指的是数据真正地写入到设备或文件中,导致缓冲区刷新地原因有很多:

  • 程序正常结束,main中地return语句被执行,导致缓冲区刷新。
  • 缓冲区满
  • 使用endl显式刷新缓冲区
  • 使用unitbuf设置流的内部状态,以此来清空缓冲区。
  • 一个输出流可能关联到另一个流。当读写被关联的流时,关联到的流的缓冲区会被刷新。

示例代码如下所示:

#include <iostream>
#include <fstream>
#include <unistd.h>  // 用于 sleep 函数// 1. 程序正常结束导致缓冲区刷新
void normalTermination() {std::cout << "\n1. 程序正常结束刷新示例:\n";std::cout << "这条消息会在程序结束时自动刷新";// 无显式刷新,依靠main函数return刷新
}// 2. 缓冲区满导致自动刷新
void bufferFull() {std::cout << "\n2. 缓冲区满自动刷新示例:\n";// 通常缓冲区大小约为4KB,这里用循环填满for (int i = 0; i < 1000; ++i) {std::cout << "填充缓冲区数据 " << i << " ";}std::cout << "\n缓冲区已满并自动刷新\n";
}// 3. 使用endl显式刷新
void explicitFlush() {std::cout << "\n3. 使用endl显式刷新示例:\n";std::cout << "这条消息会立即显示" << std::endl;std::cout << "下一条消息" << std::endl;
}// 4. 使用unitbuf设置流状态
void unitbufExample() {std::cout << "\n4. unitbuf设置示例:\n";std::cout << std::unitbuf;  // 开启每次操作后自动刷新std::cout << "unitbuf模式 - 每次输出后自动刷新";sleep(1);std::cout << " 即使没有换行也会刷新";std::cout << std::nounitbuf;  // 关闭自动刷新std::cout << "\n恢复普通模式\n";
}// 5. 关联流导致的刷新
void tiedStreams() {std::cout << "\n5. 关联流刷新示例:\n";std::ofstream logfile("log.txt");// 将cout与logfile关联std::cout.tie(&logfile);std::cout << "向cout写入会刷新logfile: ";logfile << "这条消息会立即写入文件\n";// 请求输入也会刷新关联的coutstd::cout << "请输入一个数字: ";int num;std::cin >> num;std::cout << "你输入了: " << num << std::endl;// 恢复默认关联std::cout.tie(nullptr);
}int main() {normalTermination();bufferFull();explicitFlush();unitbufExample();tiedStreams();// 程序结束时会自动刷新所有缓冲区return 0;
}

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

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

相关文章

springboot的后端处理HTML的页面请求

下面是一个完整的 Spring Boot 后端示例&#xff0c;用于接收 <form> 提交的文件上传请求&#xff08;/article/uploadLifeImage 接口&#xff09;&#xff0c;并将上传的文件保存到本地目录。 ✅ 一、项目结构 upload-demo/ ├── src/ │ └── main/ │ ├…

深入探究 Go 语言中使用 SQLite 数据库

引言 在软件开发中&#xff0c;数据库是管理和存储数据的关键组件。SQLite 作为一款轻量级的嵌入式数据库&#xff0c;因其零配置、高性能和易于集成等特性&#xff0c;成为众多小型项目和嵌入式系统的理想选择。而 Go 语言以其高效、简洁的特点&#xff0c;为操作 SQLite 数据…

Portable Computer Power Adapter

Portable Computer Power Adapter 笔记本电源适配器&#xff0c;将220伏特的交流电转化直流电 现在的适配器真的体积之大&#xff0c;让我无法理解&#xff0c;本来便携计算机为了方便减少体积重量&#xff0c;现在都倒反天罡了。让我无法理解设计师是怎么干出来的。这玩意有2…

Uniapp 网络请求封装专题

目录 一、前言 二、uniapp官方文档 三、举例演示 3.1 使用说明 3.2 Content-Type 3.2.1 ​​基本概念 ​​3.2.2 核心作用 3.2.3 常见 Content-Type 类型及使用场景 1&#xff09;文本类 a&#xff09;text/plain​​​​ b&#xff09;text/html​​ 2&#xf…

2025年渗透测试面试题总结-2025年HW(护网面试) 07(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 2025年HW(护网面试) 07 一、OWASP Top 10 2023核心漏洞 二、XSS窃取Cookie全流程 三、渗透测试五阶段模型…

Seata分布式事务解决框架

Seata&#xff08;Simple Extensible Autonomous Transaction Architecture&#xff09;是一个开源的分布式事务解决方案&#xff0c;旨在帮助开发者更容易地在微服务架构中解决分布式事务问题。 你可以把它理解为一个工具箱&#xff0c;专门用来处理微服务之间操作的一致性。…

旧物回收小程序开发:开启绿色生活新方式

在环保理念日益深入人心的今天&#xff0c;每一件旧物都承载着资源再生的无限可能。我们精心打造的旧物回收小程序&#xff0c;宛如一把神奇的钥匙&#xff0c;为你开启绿色生活新方式&#xff01; 想象一下&#xff0c;家中堆积如山的旧衣物、闲置的电子产品、废弃的书籍杂志…

STM32 串口通信②:蓝牙模块HC-05控制单片机

一 前言 上一篇我们已经成功实现单片机和电脑的连接&#xff0c;接下来&#xff0c;我们学习一个有趣的板块&#xff0c;HC-05蓝牙模块&#xff0c;这个蓝牙模块&#xff0c;我们就要建立手机和单片机的通讯啦&#xff0c;还是比较有趣的一个过程&#xff0c;大家可以跟着多操作…

【Verilog】Verilator的TestBench该用C++还是SystemC

Verilator的Testbench&#xff08;测试平台&#xff09;主要使用 C 或 SystemC 来编写。这是由Verilator的工作原理决定的&#xff1a;它将你的Verilog/SystemVerilog设计转换成一个C类&#xff0c;因此你需要一个C环境来实例化和驱动这个类。 下面详细说明这两种方式以及如何…

71-Oracle Undo与Flashback管理(Guarantee设置)深度解析

小伙伴们有没有在操作undo表空间、Flashback管理&#xff0c;时间保留设置&#xff0c;总有些配置需要提前预置好&#xff0c;否则闪回查询和表的时候出现报错。 需短期恢复&#xff08;秒级~小时&#xff09;直接上UNDO_RETENTION同时启用RETENTION GUARANTEE&#xff0c;Und…

单片机——浮点数转换4位数码管显示

浮点数转换4位数码管显示 static char buffer[5]; int DecimalPlace 0; #define HideChar h void DisplayFloatOn4LED(float value) {long integer roundf(value );if (integer > 9999) //4位{integer 9999;snprintf(buffer, sizeof(buffer), "%4ld", integer…

金融行业B端系统布局实战:风险管控与数据可视化的定制方案

摘要 在金融行业&#xff0c;一次小小的数据泄露可能引发千万级资金损失&#xff0c;一次错误的风险评估或许让企业陷入危机。传统 B 端系统布局在应对复杂多变的金融业务时&#xff0c;常出现风险预警滞后、数据杂乱无章的情况&#xff0c;让从业者如履薄冰。如何才能在瞬息万…

融合LSTM与自注意力机制的多步光伏功率预测新模型解析

这篇论文《Improved multistep ahead photovoltaic power prediction model based on LSTM and self-attention with weather forecast data》&#xff08;2024, Applied Energy&#xff09;聚焦在 多步光伏功率预测 中&#xff0c;如何结合 LSTM 与自注意力机制&#xff08;se…

Blazor-内置输入组件

封装的输入组件 InputCheckbox&#xff1a;表示复选框。InputDate&#xff1a;表示类型为 date 的日期选择框。InputFile&#xff1a;表示文件上传。InputNumber&#xff1a;表示数字框。InputRadio&#xff1a;表示单选按钮。InputRadioGroup&#xff1a;表示单选按钮组。Inpu…

Qt源码分析: QChildEvent

本文记录QChildEvent事件相关代码分析。 注1&#xff1a;限于笔者研究水平&#xff0c;难免有表述不当&#xff0c;欢迎批评指正。 注2&#xff1a;博文会不定期更新&#xff0c;敬请关注。 一、QChildEvent的发送 分析QObject::setParent代码&#xff0c;当修改父对象时&…

《Whisper :说明书 》

[论文] [模型卡] [Colab 示例] Whisper 是一种通用的语音识别模型。它基于各种音频的大型数据集进行训练&#xff0c;也是一种多任务模型&#xff0c;可以执行多语言语音识别、语音翻译和语言识别。 方法 Transformer 序列到序列模型针对各种语音处理任务进行训练&#xff0c;…

回溯----8.N皇后

题目链接 /** 将n个棋子放在n*n的棋盘上,不同列,不同行,不同斜线 大致执行流程: 首先选取第一行第一格放置第一个棋子,再从第二行第一个位置开始选取合法的位置(不同行不同列不同斜线)放置棋子,重复上述流程迭代行数, 直到放置n个棋子。 若放置途中出现无合法位置的情况,回溯将…

微机电子拉伸试验机

对于不同材料的试样&#xff0c;由于其化学成分及组织的不同&#xff0c;在拉伸过程中会体现 出不同的物理现象及力学性质。西安力创&#xff08;LETRY&#xff09;公司专业制造WDL/WDW系列微机控制电子万能试验机&#xff0c;主要适用于金属板材、棒材、管材、金属丝、金属箔、…

【数据结构与算法】数据结构核心概念系统梳理

第一章 绪论:基础概念体系 🚩算法:问题求解步骤的描述。 🚩非递归的算法效率更高。 1.1 逻辑结构 vs 存储结构 维度逻辑结构存储结构(物理结构)定义数据元素之间的逻辑关系数据结构在计算机中的实现方式分类线性/树形/图/集合顺序/链式/索引/散列独立性独立于存储结构…

73页PPT | 大数据平台规划与数据价值挖掘应用咨询项目解决方案

推荐摘要&#xff1a;在数字化浪潮中&#xff0c;企业数据量呈几何级增长&#xff0c;却常因缺乏科学规划的大数据平台&#xff0c;陷入数据孤岛、处理效率低下的困境&#xff0c;难以充分挖掘数据价值。特推出大数据平台规划与数据价值挖掘应用咨询项目解决方案&#xff0c;正…