C++中的IO类

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

应用程序不只从控制台窗口进行IO操作,常常需要读写命名文件,并且使用IO操作处理string的字符会很方便,所以在istream和ostream之外,标准库还定义了其他的一些IO类型,分别定义在三个独立的头文件中:iostream定义了用于读写流的基本类型,fstream定义了读写命名文件的类型,sstream定义了读写内存string对象的类型。

类型ifstream和istringstream都继承自istream。因此我们可以像使用istream对象一样来使用ifstream和istringstream对象。需要注意的是,不能对IO对象进行拷贝或赋值,另外读写一个IO对象会改变其状态,因此传递和返回的引用不能是const的

条件状态

IO类定义了一些函数和标志,可以帮助我们访问和操纵流的条件状态。一个流一旦发生错误,其后的IO操作都会失败,确定一个流对象的最简单的方法就是将他作为一个条件去使用:

while(cin>>word)

IO库定义了一个与机器无关的iostate类型,它提供了表达流状态的完整功能:
badbit表示系统级错误,如不可恢复的读写错误;failbit表示可恢复错误,如期望读取数值缺读取了一个字符;达到文件结束的位置时,eofbitfailbit都会被置位。goodbit的值为0表示未出现错误。如果badbitfailbiteofbit任意一个被置位,检测流的条件都会失败。

输出缓冲管理

每个输出流都有一个缓冲区,用于保存程序读写的数据,如下面的代码

os<<"Hello,world";

有可能直接打印也有可能被操作系统保存到缓冲区中,随后再打印。
显式刷新缓冲区的几个方法:

cout<<"Hello,world"<<endl;  //输出字符串之后输出换行然后刷新缓冲区
cout<<"Hello,world"<<flush; //输出字符串之后直接刷新缓冲区
cout<<"Hello,world"<<ends;  //输出字符串之后输出空白字符然后刷新缓冲区

当输入流关联到输出流的时候,任何试图从输入流读取数据的操作都会先刷新关联的输出流,标准库将cout和cin关联到一起,可以使用tie()函数手动将istream和ostream关联到一起。

文件输入输出

open和close函数

在定义了一个空文件流对象之后,可以调用open将其与文件关联起来

ifstream in(ifile); //构造一个ifstream并打开给定文件
ofstream out;   //输出文件流未与任何文件相关联
out.open(ifile+".copy") //打开指定文件

文件流打开之后就会保持和对应文件的关联,如果试图将这个文件流关联到另一个文件上,必须先关闭相应的文件流。

in.close(); //关闭文件
in.open(ifile+"2"); //关联到新的文件

文件模式

每个流都有一个关联的文件模式,用来指出如何使用文件,每个文件流类型都定义了一个默认的文件模式,当我们未指定文件模式时,就使用默认模式。与ifstream关联的文件默认以in模式(读方式)打开;与ofstream相关联的文件默认以out模式(写方式)打开。文件模式如下表:

  • in 以只读方式打开
  • out 以写方式打开
  • app 每次写操作前均定位到文件末尾
  • ate 打开文件后立即定义到文件末尾
  • trunc 截断文件
  • binary 以二进制进行IO

默认情况下,当打开一个ofstream时,文件的内容会被丢弃。阻止一个ofstream清空给定文件内容的方法是同时指定app模式。

ofstream out("file1")   //文件会被清空
ofstream out("file",ofstream::app|ofstream::out)    //以app方式打开会被保存

保留ofstream打开的文件中数据的唯一办法就是指定app形式打开或者in模式打开。

string流

sstream头文件定义了三个类型来支持内存IO,这些类型可以向string写入数据,从string读取数据,就像string是个IO流一样。

当我们的工作是对整行文本进行处理,而其他的一些工作是处理行内的单个单词时,通常可以使用istringstream

string line,word;
vector<PersonInfo> people;
while(getline(cin,line)){   //不断从cin读取一行PersonInfo info;istringstream record(line);   //利用读取的这一行初始化record对象record>>info.name;      //从这一行中单独处理每个单词while(record>>word)info.phones.push_back(word);people.push_back(info);
}

在我们逐步构造输出,希望最后一行打印时,ostringstream非常有用。

for(const auto &entry:people){ostringstream formatted,badNums;for(const auto &nums:entry.phones){if(!valid(nums)){   //如果遇到无效电话号码,则放到badNums之后一起输出badNums<<" "<<nums;}elseformatted<<" "<<format(nums);   //将正常的电话号码都放到formatted中}if(badNums.str().empty())os<<entry.name<<" "<<formatted.str()<<endl;elsecerr<<"Input error: "<<entry.name<<" invalid number(s) "<<badNums.str()<<endl;
}

转载于:https://www.cnblogs.com/frankkk/p/9179184.html

[C++]C++中的IO类相关推荐

  1. 【C++】IO库 : IO类,文件输入输出,string流

    前面已经在用的IO库设施 istream:输入流类型,提供输入操作. ostream:输出流类型,提供输出操作 cin:一个istream对象,从标准输入读取数据. cout:一个ostream对象, ...

  2. java中的IO操作之File类

    Java的集合框架:  类和接口存在于java.util包中. Java的IO:               类和接口存在于java.io包中. 学习方法:  文档在手,天下我有! --------- ...

  3. 这篇文章告诉你装饰器模式及其在Java IO类和MyBatis中的应用

    装饰器(Decorator)模式:指不改变现有对象结构的情况下,动态地给该对象增加额外功能. 一.装饰器模式介绍 装饰器模式允许向一个现有的对象添加新的功能,同时不改变其结果.比如Java 中的IO框 ...

  4. Java中的File类和IO流

    Java中的File类和IO流 File类 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. File的分隔符 import java.io.Fi ...

  5. c++语言文件流,C++ IO类、文件输入输出、string流详细讲解

    新的C++标准中有三分之二的内容都是描述标准库.接下来重点学习其中几种核心库设施,这些是应该熟练掌握的. 标准库的核心是很多容器类(顺序容器和关联容器等)和一簇泛型算法(该类算法通常在顺序容器一定范围 ...

  6. .net中的IO体系介绍

    .net中对于IO流的支持分为两个层次:基于字节和基于字符两种方式. 基于字节的方式: 基于字节的方式适用于任何场合,因为任何文件的数据都是基于字节的方式有序存放的.基于字节的方式适用于操作二进制文件 ...

  7. java中的IO操作总结(一)

    转载:http://www.cnblogs.com/nerxious/archive/2012/12/15/2818848.html    所谓IO,也就是Input与Output的缩写.在java中 ...

  8. java中源代码的类_java中源代码功能了解

    datainput和dataoutput类的作用: java.io.DataInput  一句话概括,从二进制流中读取字节到缓存数组 从二进制流中转化字节 读取一些字节从输入流中,存储他们在缓存数组中 ...

  9. java输出流输入流的使用_Java中的IO流之文件输入输出流

    Java中的IO流之文件输入输出流 1.文件流介绍 文件流是以字节为单位进行读写文件的,所以属于字节流,并且是低级流.文件流位于java.io包下. 输入输出流分别是FileInputSteam和Fi ...

最新文章

  1. 企业网络推广之下滴滴造车野心不减,“造车时代”想入局恐需技术先行
  2. MySQL不能插入中文字符及中文字符乱码问题
  3. Tengine开源新特性:如何让HTTPS处理能力轻松翻倍?
  4. You third iOS app,这个APP要放到手机上面运行,才会成功,才会新建记录。
  5. 由马化腾谈“微博修改功能”,看什么是优秀的产品经理
  6. 容器编排技术 -- Kubernetes StatefulSet基本使用
  7. free释放链表节点崩溃_【链表6】lt;最新gt;初识链表(link list)
  8. (转)C 语言高效编程的几招
  9. cnn可视化 感受野(receptive field)可视化
  10. 程序员伪装 AI 编程,竟骗来 2 亿的投资!
  11. [导入]【布鲁斯威利斯】【虎胆龙威4最终珍藏版】【1024x432RMVB 1.41GB】【20:50】...
  12. PLC程序的组成结构
  13. 2018中级职称计算机题库,2018年中级通信工程师传输与接入考试试题
  14. MacW资讯:苹果电脑删除磁盘分区及双系统分区的办法
  15. Linux/Unix桌面趣事:让桌面下雪
  16. matlab设置三维图等高线,MATLAB --三维图形等高线
  17. 不到两年的前端小白2017个人年终总结:今年的年终总结是为了更好的自己
  18. 双活数据中心架构分析及优缺点
  19. JSON转List集合
  20. python基础经典问题-判断身份证号码是否有效

热门文章

  1. JavaScript服务器端开发基础之Math对象小结
  2. LVS详解及基于LVS实现web服务器负载均衡
  3. CTO(首席技术官)
  4. MIT开放式课程“自然语言处理”介绍
  5. swift设置启动图不现实_如何通过装饰房屋来开始在Swift中使用增强现实
  6. Android开发中应避免的重大错误
  7. tmux系统剪切板_实践中的tmux:与系统剪贴板集成
  8. 协议分析中的TCP/IP网络协议
  9. 二进制_Kubernetes集群二进制部署
  10. 下java7 64有什么用_Win 7 64位系统安装java 8,看完就明白了