C++标准库之IO库

2023-11-05

IO类

基本内容

iostream库包含两个基础类型: istream , ostream 。
cin: 一个istream对象,用来从标准输入读取数据
cout:同cin
cerr:用于输出程序错误信息,写到标准错误。

方法:
getline() :从一个给定的istream读取一行数据,存入给定的string对象中。

其他IO类型

除了iostream用于读写流的基本类型,还有其他不同种类的IO处理操作:

  • fstream:用于读写命名文件
  • sstream:用于读写内存string对象

fstream头文件定义了ifstream,ofstream,fstream三种类型。
sstream头文件定义了istringstream,ostringstream,stringstream三种类型。

ifstream,istringstream都继承自istream ,故可使用cin和getline函数。
out 同理。

io类所定义的一些函数和标志

io操作与生俱来的问题就是可能发生错误。

标志(flags)
  • strm::iostate 是一种机器相关的类型,提供表达条件状态的完整功能。
  • strm::badbit 用来指出流以崩溃---------------------------------------------------------------系统级错误
  • strm::failbit 用来指出一个io操作失败了----------------------------------------------------可恢复错误
  • strm::eofbit 用来指出流到达了文件结束
  • strm::goodbit 用来指出流为处于错误状态。此值保证为0.
函数
  • s.eof() 若流s的eofbit置位,返回true。
  • s.fail() 若流s的failbit,badbit置位,返回true。
  • s.baf() 若流s的badbit置位,返回true。
  • s.good() 若流s处于有效状态,返回true。
  • s.clear() 将流中所有条件状态位复位,流的状态设置为有效。返回void。
  • s.clear(flags) 根据给定的flags标志位复位。返回void。
  • s.setstate(flags) 根据给定flags,将s对应的状态 置位。返回void。
  • s.rdstate() 返回流s的当前条件状态,返回值类型位strm::iostate。

只有当一个流处于无错状态时,我们才可以从它读取数据,向它写入数据。

最简单的方法:

while(cin>>word){
	//操作
}

good和fail是确定流的总体情况的正确方法。
而eof和bad只能表示特定错误。

管理条件状态

使用autu自动获取cin的状态的类型

auto old_state = cin.rdstate();

便可以使用状态条件的函数

cin.setstate(old_state);
cin.clear(cin.rdstate() & ~cin.failbit & ~cin.badbit);//将failbit,badbit复位,eofbit不变。

管理输出缓存

每个输出流都管理一个缓存区
有了缓存机制,可以带来很大的性能提升。

导致缓存刷新的原因
  • 程序正常结束(main函数return)
  • 缓存区已满
  • 可以使用endl显式刷新缓存区
  • 可以使用操作符unitbuf设置流内部状态,来清空缓存区。默认情况下,cerr是设置unitbuf的,写入cerr的内容都是立刻刷新。
  • 一个输出流可能被关联到另一个流。当读写被关联流时,关联到的流会自动刷新。例如,默认情况下,cin和cerr都关联到cout。因此读cin或写cerr都会导致cout缓存区刷新。
刷新输出缓存区
cout<<endl;
cout<<flush;
cout<<ends;
unitbuf操作符

如果想每次输出操作后都刷新缓存区,使用unitbuf。

cout<<unitbuf;

回到正常缓存方式

cout<<nounitbuf;
警告:如果程序崩溃,输出缓存区不会刷新

关联输入输出流

交互式系统应该关联输入输出流。

cin.tie();返回cin关联到的流指针。
cin.tie(&cout);将cin关联到cout
cin.tie(nullptr);解关联

每个流同时最多关联到一个流。
但多个流可以同时关联到同一个流。

文件输出输出

除了继承自iostream类型的行为外,fstream中定义的类型还增加了一些新的成员来管理与流相关的文件。

  1. 创建一个未绑定的文件流。
fstream fstrm;
  1. 创建一个fstream,并打开名为s的文件。s可以是string,也可以是c风格字符串指针。这些构造函数都是explicit的(不能使用拷贝初始化,例如 fstream f = "c/a.txt"; ),默认的文件模式依赖于fstream类型。
fstream fstrm(s);
  1. fstream fstrm(s,mode); 按指定类型打开文件。

  2. fstrm.open(s);打开名为s的文件。

  3. fstrm.close(); 关闭文件,返回void。

  4. fstrm.is_open(); 返回bool。

使用文件流对象

例如

ifstream in(ifile);
ofstream out;
out.open(ifile+".copy");

检查文件是否打开
if(out){}

对一个已经打开的文件流调用open会导致failbit被置位。
想将文件流关联到另一个文件需要:

in.close();
in.open(ifile+"2");

自动构造和析构

ifstream input(s);在离开作用域后会自动析构。
不需要调用input.close();

文件模式

in 只
out 只
app 每次操作前定义到文件末尾
ate 打开文件后立刻定义到文件末尾
trunc 截断文件(与out一同使用,默认情况out模式打开文件也会被阶截断)。
binary 以二进制方式进行IO

不使用截断文件的out需要。
ofstream out(“file”,ofstream::out | ofstream::app);
ofstream out(“file”, ofstream::app);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++标准库之IO库 的相关文章

随机推荐

  • 完美立方(C语言)

    题目 形如 a 3 b 3 c 3 d 3a 3 b 3 c 3 d 3 的等式被称为完美立方等式 例如 12 3 6 3 8 3 10 312 3 6 3 8 3 10 3 编写一个程序 对任给的正整数 N N le 100 N N 10
  • C# AES加密算法

    using System using System Collections Generic using System IO using System Linq using System Security Cryptography using
  • Gradle 团队发布了Gradle 7.2

    Gradle 团队近日发布 Gradle 7 2 Gradle 是一个类似于 Maven 项目的自动化构建工具 支持依赖管理和多项目 Gradle 抛弃了 Maven 基于 XML 的繁琐配置 取而代之的是Gradle 采用了特定语言 Gr
  • python实现堆栈和队列

    1 python实现堆栈 可先将Stack类写入文件stack py 在其它程序文件中使用from stack import Stack 然后就可以使用堆栈了 stack py的程序如下 class Stack def init self
  • linux下通过mount挂载iscsi、ntfs、nfs详解

    通常服务器本机自带磁盘空间有限 都需要额外加载磁盘 可以采用mount方式把远程的共享存储磁盘加载进来 目前用过的有iscsi ntfs nfs三种类型 一 mount挂载iscsi类型1 查找下准备挂载的磁盘或者存储器 root loca
  • SSL P2415 连通块

    2008 南海初中竞赛 连通块 Time Limit 10000MS Memory Limit 65536K Total Submit 41 Accepted 19 Case Time Limit 1000MS
  • Ubuntu使用vim报错 “/user/lib/python3.10/site.py“ E212: Can‘t open file for writing

    这个错误是由于没有足够的权限导致的 尝试使用sudo命令来重启编辑器或者直接打开终端并使用sudo命令编辑文件 需要重新打开命令行 但是现在是ssh 可能是用root权限进入vim后权限过期 折磨我十分钟 在网上搜了很多方法也没有解决 最后
  • 第13节-PhotoShop基础课程-裁剪工具

    文章目录 前言 1 裁剪工具 1 基本操作 Alt Shift 2 拉直 3 内容识别 自动填充 2 透视裁剪工具 3 切片工具 长图分成多个 4 切片选择工具 5 存储为一张一张 前言 1 裁剪工具 1 基本操作 Alt Shift 2
  • openwrt 查看运行程序_Go 语言交叉编译在 openwrt 上运行的程序

    go 语言一个很好的地方是可以方便的进行交叉编译 也就是编译出在不同于当前硬件平台 操作系统 上运行的程序 今天尝试编译一段代码到小米路由器 3G 上运行 具体过程记录在下面 供大家参考 环境 编译环境 mac go 1 11 运行环境 路
  • 逻辑回归:逻辑回归中的参数

    转载自 https blog csdn net Captain DUDU article details 105081643 LogisticRegression 一共有14个参数 逻辑回归参数详细说明 参数说明如下 penalty 惩罚项
  • hadoop高可用集群启动yarn失败

    hadoop高可用集群启动yarn失败 通过查看日志信息发现主要错误如下 org apache zookeeper ClientCnxn Session 0x0 for server null unexpected error closin
  • WindowsError:[Error ] 全系列

    ERROR FILE NOT FOUND 指定的文件不存在 ERROR INVALID PARAMETER 参数错误 ERROR ACCESS DENIED 访问被拒绝 ERROR INVALID HANDLE 无效的句柄 ERROR NO
  • Kotlin基础

    Kotlin是什么 它是一种针对 java 平台的新编程语言 Kotlin 简洁 安全 务实 Kotlin可以运行在 任何 java 运行的地方 并且能够和 java语言无缝对接上 kotlin语言和java语言一样 都是静态语言 java
  • PCB设计时对于EMC有哪些需要注意的?

    详细如下 EMC的PCB设计技术 分层 布局 布线 pcb的emc设计 Me sl 的博客 CSDN博客 PCB EMC 设计的关键 是尽可能减小回流面积 让回流路径按照设计的方向流动 最常见返回电流问题来自于参考平面的裂缝 变换参考平面层
  • MySQL数据库 【增删改查】

    目录 一 新增 指定列插入 一次插入多个数据 二 查询 1 全列查询 2 指定列查询 3 查询字段为表达式 4 查询的时候给列名 表达式 指定别名 5 查询时去重 6 排序查询 7 条件查询 8 模糊查询 9 空值查询 10 分页查询 三
  • JavaScript中的字符串替换

    今天一大早遇到个状况 json字符串中有些undefined数据 导致图表不能正常显示 本来打算用isNaN判断是否是数字 后来感觉操作起来有些麻烦 就打算用 null 把 undefined 全部替换到 于是用replace函数进行替换
  • 菜鸟的我运行了hello word 在华为鸿蒙2.0beta

    相信自从华为上次华为鸿蒙发布会之后 不少尝鲜用户都已经使用华为鸿蒙的IDE开发程序 那么网上的教程也很多 这里我通过华为鸿蒙官方教程成功安装并且成功运行hello word 我还是菜鸟 大佬勿喷 鸿蒙源码 https openharmony
  • MFC之菜单栏的相关使用14

    1 菜单栏选项的打勾 加粗 禁用 首先我们需要知道菜单栏包含子菜单栏 依次使用下标去区分 然后拿到子菜单栏后 就可以操作里面的选项了 可以通过下标 选项的ID 在资源视图的菜单栏的图 点击选项右击属性即可获取 进行操作 代码 由于为了减少视
  • 【学习日志】【TCN】时间序列卷积神经网络(1)

    1 ask bing Temporal Convolutional Network 问 我对CNN RNN TCN等神经网络没有任何基础 你能直观地给我讲一下TCN的结构 输入输出和原理吗 bing对TCN的解释如下 TCN是一种用于处理序
  • C++标准库之IO库

    IO类 基本内容 iostream库包含两个基础类型 istream ostream cin 一个istream对象 用来从标准输入读取数据 cout 同cin cerr 用于输出程序错误信息 写到标准错误 方法 getline 从一个给定