当前位置: 首页 > news >正文

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;
}

相关文章:

  • Frida Hook Android App 点击事件实战指南:从进程识别到成功注入
  • 程序包androidx.fragment.app不存在 import androidx.fragment.app
  • STM32连接阿里云物联网平台
  • 【51单片机2个外部中断控制流水方向与引脚电平】2022-5-4
  • 基于PostgreSQL的百度或高德等POI多层级分类的数据库设计
  • 云原生 CAD 让制造业设计协同更便捷
  • Docker快速部署可视化防火墙工具:使用go语言开发,底层是iptables,提供API调用
  • 动手用 Web 实现一个 2048 游戏
  • 基于分布式部分可观测马尔可夫决策过程与联邦强化学习的低空经济智能协同决策框架
  • 【MySQL基础】MySQL复合查询全面解析:从基础到高级应用
  • 前端依赖升级完全指南:npm、pnpm、yarn 实践总结
  • python系列教程245——为什么需要继承
  • Linux——7.如何理解 shell
  • C#图书管理系统笔记(残缺版)
  • STM32F103C8T6 学习笔记摘要(四)
  • 前端截图并导出pdf
  • dify应用实践教程5
  • 量子机器学习前沿:量子神经网络与混合量子-经典算法
  • 【图片识别改名】自动识别图片中的文字并给图片命名 ,图片自动识别并且能重命名的操作步骤和注意事项
  • Spark基于Bloom Filter算法的Runtime Filter Join优化机制
  • 如何做彩票网站的源码/西安百度推广优化公司
  • 玩具网站设计/网络营销方案案例
  • 国外 网站 模板/搜狗seo查询
  • 全面的网站制作/网站优化网站优化
  • 破解php网站后台账号密码/大一html网页制作
  • 网站建设流程教案/苏州网站建设书生