博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[C++]C++中的IO类
阅读量:4633 次
发布时间:2019-06-09

本文共 2364 字,大约阅读时间需要 7 分钟。

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"<

当输入流关联到输出流的时候,任何试图从输入流读取数据的操作都会先刷新关联的输出流,标准库将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
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<<" "<

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

你可能感兴趣的文章
TMS320F28335项目开发记录2_CCS与JTAG仿真器连接问题汇总
查看>>
PS多形式的部分之间复制“笨办法”
查看>>
最强的篮球队和马尔可夫模型
查看>>
hdu-4302-Holedox Eating-线段树-单点更新,有策略的单点查询
查看>>
cocos2d-x 音效中断问题
查看>>
设计模式简要笔记
查看>>
子分类账知识学习(汇总网上比较有用的资料)
查看>>
关于JQuery中的ajax请求或者post请求的回调方法中的操作执行或者变量修改没反映的问题...
查看>>
pyQt 每日一练习 -- 登录框
查看>>
wp 删除独立存储空间文件(多级非空文件夹删除)
查看>>
Loadrunner安装使用入门
查看>>
smartupload 上传文件时 把页面编码改成gbk 解决乱码
查看>>
EPS是什么格式
查看>>
新闻网大数据实时分析可视化系统项目——5、Hadoop2.X HA架构与部署
查看>>
【原创】Linux环境下的图形系统和AMD R600显卡编程(11)——R600指令集
查看>>
input禁止显示历史输入记录
查看>>
本日进度6
查看>>
两下或多下回车造成数据库多次提交事物的解决方法
查看>>
Python的数据库操作(Sqlalchemy)
查看>>
2.抽取代码(BaseActivity)
查看>>