C++基础之IO类
下面是IO类的继承关系:
ifstream和istringstream都继承自istream。因此,我们可以在传递istream对象的地方传递ifstream和istringstream。
例如:对ifstream和istringstream对象调用getline,也可以用>>从ifstream和istringstream读取数据。
类似的ofstream和ostringstream也都继承自ostream。
IO库和头文件如下:
头文件 | 类型 |
iostream |
istream,wistream从流读取数据 ostream,wostream向流写入数据 iostream,wiostream读写流 |
fstream |
ifstream,wifstream从文件读取数据 ofstream,wofstream向文件写入数据 fstream,wfstream读写文件 |
sstream |
istringstream,wistringstream从string读取数据 ostringstream,wostringstream向string写入数据 stringstream,wstringstream读写string |
IO类定义了一些函数和标志,帮助我们访问和控制流的状态条件。
strm::iostate strm是指一种IO类型,iostate是一种机器相关的类型,提供表达条件状态的完整功能。
strm::badbit 标志流已崩溃
strm::failbit 标志IO操作失败了
strm::eofbit 标志达到文件结尾
strm::goodbit 流未出现错误状态,此值保证为0
s.eof() 若流s的eofbit置位,则返回true
s.fail() 若流s的failbit或badbit置位,则返回true
s.bad() 若流s的badbit置位,则返回true
s.good() 若流s处于有效状态,则返回true
s.clear() 将流的所有条件复位,状态设置为有效,返回void
s.clear(flags) 根据flags标志位,将s中对应条件状态复位,flags类型为strm::iostate。返回void
s.setstate(flags) 根据flags标志位,将s中对应条件状态置位,flags类型为strm::iostate。返回void
s.rdstate() 返回流的当前条件状态,返回类型为strm::iostate
确定流的状态最简单的方法是把它当做条件来使用。
例如:
while(cin >> n){//while会循环检查输入的状态,成功则保持循环
...
注意:
badbit是系统级错误,如不可恢复的读写错误;一般badbit置位了流就无法继续使用。
failbit是可恢复错误,例如希望读取数值,却读取了一个字符,这种错误可以修正,流还可以继续使用。
如果达到文件结束位置,eofbit和failbit都会被置位。
googbit表示流未发生错误,值为0。
只要badbit、failbit、eofbit任意一个被置位,检查流的状态的条件会失败。
auto oldState = cin.rdstate();//记住cin的当前状态
cin.clear();//使cin有效
process_input(cin);//使用cin
cin.setstate(oldState);//将cin的状态还原
或者这样使用:
cin.clear(cin.rdstate()&~cin.failbit&~cin.badbit);//只复位failbit和badbit
进行IO操作的函数通常以引用的方式传递和返回流。
每个输出流都管理一个缓冲区,用来保存程序读写的数据。
例如:
cout << "Please input:";
字符串不一定会立刻打印出来,可能保存到缓冲区随后打印,所以有时调试时,没有输出,可以看看自己刷新了缓冲区吗?
如果程序异常终止,缓冲区是不会被刷新的,当一个程序崩溃后,它的输出很可能停留在输出缓冲区中等待打印。
会导致刷新缓冲区的原因:
- 程序正常结束,作为main函数的return的一部分,缓冲刷新被执行。
- 缓冲区满,需要刷新缓冲区,而后新的数据才能写入。
- 使用操纵符:endl来显示刷新缓冲区。
- 每个输出操作后,可以用操作符unitbuf设置流的内部状态,来清空缓冲区。默认情况下,cerr是设置unitbuf的,因此写到cerr中的数据都是立即刷新的。
- 一个输出流被关联到另一个流,此时,当读写被关联的流时,关联到流的缓冲区会被刷新。默认cin和cerr都关联到cout,因此读cin或写cerr都会导致cout的缓冲区被刷新。
endl 换行并刷新缓冲区;
ends 插入一个空字符并刷新缓冲区;
flush 仅刷新缓冲区
使用tie函数手动关联流:
cin.tie(&cout);//将标准库cin和cout关联到一起
//oldTie指向当前关联到cin的流,如果存在的话
ostream* oldTie = cin.tie(nullptr);//cin不再与其他流关联
cin.tie(&cerr);
cin.tie(oldTie);//重建cin与cout的正常关联
流的操作函数,以istream为例。
istream流 的操作:
1、opeartor>>操作
<<操作返回一个ostream对象的引用,所以可以连续使用
2、get( )
get( )操作:
读取单个字符
返回一个整数
get(char&)操作:
读取单个字符
返回一个istream对象的引用
3、getline( )
读取一行,遇到回车键返回istream对象的引用
getline()操作与>>的区别:
char string1 [256],
cin.getline(string1, 256); //get a whole line, 以'\0'结尾
cin >> string1; //stop at the 1st blank space
4、read( )
read(buf, len)
返回一个istream对象的引用
对空白字符(包括'\n')照读不误
5、peek( ) 与 putpack()
peek:查看而不读取
putback:将一个字符添加到流
文件流总结
需要包含的头文件: <fstream>
fstream提供了三个类,用来实现c++对文件的操作。(文件的创建,读写)。
ifstream -- 从已有的文件读
ofstream -- 向文件写内容
fstream - 打开文件供读写
支持的文件类型
实际上,文件类型可以分为两种: 文本文件和二进制文件.
文本文件保存的是可读的字符, 而二进制文件保存的只是二进制数据。利用二进制模式,你可以操作图像等文件。用文本模式,你只能读写文本文件。否则会报错。
string流
在sstream头文件中定义了三个类型来支持内存的IO,通过ostringstream可以向string写入数据,通过istringstream从string读取数据,通过stringstream向string读写数据
stringstream特有的操作:
sstream strm | strm是一个未绑定的stringstream对象。 |
sstream strm(s) | strm是一个stringstream对象,保存string s的拷贝。此构造函数是explicit |
strm.str() | 返回strm保存的字符串 |
strm.str(s) | 将strm保存的字符串拷贝到string s中,返回void |
当对整行文本并处理行内的某个单词进行处理,此时可以使用string流。
istringstream将string转换为int(通常可是直接使用to_string()和stoi(),stol(),stof(),stod()等实现string和数值类型的相互转换)
string s = "";
istringstream isToi(s);//将s绑定到istringstream中
int a;
isToi >> a;//string输出为int
cout << a << endl;
读取某文件中人名和电话号码:
Morgan 1646464648 1164986463
drew 15465463132
struct PersonInfo{
string name;
vector<string> phones;//多个电话号码
}
//line保存一行的信息
string line,word;
vector<PersonInfo> people;
//读取一行
while(getline(cin,line)){
PersonInfo info;
istringstream iss(line);//一行的字符串绑定istringstream
iss >> info.name;//分离出姓名,以空格分离
while(iss >> word)info.phones.push_back(word);
people.push_back(info);
}
输出上面的信息,但是不能输出有无效号码的人
for(const auto &info : people){
ostringstream formatted,badNums;//保存格式化信息和无效信息
for(const auto &num : info.phones){
if(!vaild(num))badNums << " " << num;//如果号码无效则保存在内存badNums中
else formatted << " " << num;//否则保存号码到formatted
}
if(badNums.str().empty())//没有无效号码
cout << info.name << " " << formatted.str() << endl;
else
cerr << "input error:" << info.name << " " << badNums.str() << endl;
}
C++基础之IO类的更多相关文章
- java基础知识----IO篇
写在前面:本文章基本覆盖了java IO的所有内容.java新IO没有涉及.文章依然以样例为主,由于解说内容的java书非常多了,我觉的学以致用才是真.代码是写出来的,不是看出来的. 最后欢迎大家提出 ...
- JavaSE(一) IO类层次关系和各种IO流的用法总结
今天把IO流的这一知点进行一下总结,因为在之前使用io流的时候,就只知道几个重点常用的IO类,比如FileInputStream,BufferedInputStream(缓冲流)等等,但是不知道它处于 ...
- (代码篇)从基础文件IO说起虚拟内存,内存文件映射,零拷贝
上一篇讲解了基础文件IO的理论发展,这里结合java看看各项理论的具体实现. 传统IO-intsmaze 传统文件IO操作的基础代码如下: FileInputStream in = new FileI ...
- Java基础-DButils工具类(QueryRunner)详解
Java基础-DButils工具类(QueryRunner)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC ...
- Java基础之File类的使用
Java基础之File类的使用 1.File类的构造方法和常用方法 2.对File中listFile(FileNameFilter name)学习 3.与File文件类相关的实现 File类的构造方法 ...
- java基础之IO流(二)之字符流
java基础之IO流(二)之字符流 字符流,顾名思义,它是以字符为数据处理单元的流对象,那么字符流和字节流之间的关系又是如何呢? 字符流可以理解为是字节流+字符编码集额一种封装与抽象,专门设计用来读写 ...
- IO类
Java的IO体系分为Input/Output和Reader/Writer两类,区别在于Reader/Writer在读写文本时能自动转换内码.基本上,所有的IO类多是配对的,即有XXXInput,就有 ...
- Java基础之IO流整理
Java基础之IO流 Java IO流使用装饰器设计模式,因此如果不能理清其中的关系的话很容易把各种流搞混,此文将简单的几个流进行梳理,后序遇见新的流会继续更新(本文下方还附有xmind文件链接) 抽 ...
- UML基础系列:类图
类图描述系统中类的静态结构,它不仅定义系统中的类,描述类之间的联系,如关联.依赖.聚合等,还包括类的内部结构(类的属性和操作).类图描述的是静态关系,在系统的整个生命周期中都是有效的.对象图是类图的实 ...
随机推荐
- 行车记+翻车记:.NET Core 新车改造,C# 节能降耗,docker swarm 重回赛道
非常抱歉,10:00~10:30 左右博客站点出现故障,给您带来麻烦了,请您谅解. 故障原因与博文中谈到的部署变更有关,但背后的问题变得非常复杂,复杂到我们都在怀疑与阿里云服务器 CPU 特性有关. ...
- MUI-页面传参数
点击第一个页面的标签,跳转到第二个页面,把第一个页面的值也传往目标页面 现在提供两种实现方式 注意:需要在手机运行才可以,用电脑浏览器可能不支持. 第一种方式 页面已创建,通过自定义事件传值 fir ...
- RabbitMQ的各个参数
简介 原文:https://blog.csdn.net/vbirdbest/article/details/78670550 本节主要讨论队列声明的各个参数 queueDeclare(String q ...
- 初探Electron,从入门到实践
本文由葡萄城技术团队于博客园原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 在开始之前,我想您一定会有这样的困惑:标题里的Electron ...
- 从零开始搭建Java开发环境第三篇:最新版IDEA常用配置指南,打造你的最酷IDE
刚刚使用IntelliJ IDEA 编辑器的时候,会有很多设置,会方便以后的开发,工欲善其事必先利其器. 比如:设置文件字体大小,代码自动完成提示,版本管理,本地代码历史,自动导入包,修改注释,修改t ...
- Mac下搭建go和beego开发环境
go安装 首先到golang的官网下载 直接双击安装包,安装 ,下一步,下一步....完成既可 验证安装是否成功 打开终端执行 输出 go version go1.11.5 darwin/amd64 ...
- 分享一个赚钱方法:用趣分类app在家轻松赚钱
什么是趣分类 近期,垃圾分类是社会各界和广大市民关心的一个热门话题,随着垃圾分类工作的推进,各地都掀起学习垃圾分类的热潮.为了我们的美好生活,打响"垃圾分类"这场硬仗刻不容缓.据了 ...
- P2154 [SDOI2009]虔诚的墓主人 树状数组
https://www.luogu.org/problemnew/show/P2154 题意 在一个坐标系中,有w(1e5)个点,这个图中空点的权值是正上,正下,正左,正右各取k个的排列组合情况.计算 ...
- 不修改的主席(HJT)树-HDU2665,POJ-2104;
参考:优秀的B站视频: 和 https://blog.csdn.net/creatorx/article/details/75446472 感觉主席树这个思路是真的优秀,每次在前一次的线段树的基础 ...
- codeforces 755D. PolandBall and Polygon(线段树+思维)
题目链接:http://codeforces.com/contest/755/problem/D 题意:一个n边形,从1号点开始,每次走到x+k的位置如果x+k>n则到x+k-n的位置,问每次留 ...