C++ Primer:第8章 IO库


第8章:IO库

8.1 IO类

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
  1. iostream定义了用于读写流的基本类型;fstream定义了读写命名文件的类型;sstream定义了读写内存string对象的类型。
  2. ifstream和istringstream继承自istream,ofstream和ostringstream继承自ostream。

IO对象无法拷贝赋值

  1. 由于IO对象不能拷贝和赋值,故形参或返回类型不能是流类型。进行IO操作的函数通常以引用方式传递和返回流。
  2. 读写一个IO对象会改变其状态,故传递和返回的引用不能是const。

条件状态

条件状态 描述
strm::iostate strm是IO类型
iostate是一种机器相关的类型,提供表达条件状态的完整功能
strm::badbit 用于指出流已崩溃
strm::failbit 用于指出一个IO操作失败了
strm::eofbit 用于指出流到达了文件结束
strm::goodbit 用于指出流未处于错误状态。此值保证为零
s.eof() 若流s的eofbit置位,则返回true
s.fail() 若流s的badbit或failbit置位,则返回true
s.bad() 若流s的badbit置位,则返回true
s.good() 若流s处于有效状态,则返回true
s.clear() 将流s中所有条件状态位复位,将流的状态设置为有效。返回void
s.clear(flags) flags的类型是strm::iostate
根据给定的flags标志位,将流s中对应条件状态位复位。返回void
s.setstate(flags) flags的类型是strm::iostate
根据给定的flags标志位,将流s中对应条件状态位置位。返回void
s.rdsate() 返回流s的当前条件状态,返回类型是strm::iostate
  1. 使用一个流前,需先检查流是否处于良好状态。
while(cin>>word)
    // ok:读操作成功....
  1. badbit表示系统级错误,如不可恢复的读写错误,一旦发生流不可再用;failbit表示可恢复错误,如期望读取数据与实际读到数据类型不一致,发生后可修正流仍可使用; 若到达文件结束位置,failbit和eofbit都会被置位; goodbit的值为0,表示流未发生错误。
  2. good()在所有错误位均未置位的情况下返回true;bad()、fail()、eof()在对应错误位置被置位时返回true;当badbit被置位时,fail()返回ture。故使用good()或fail()确定流的总体状态。

管理输出缓冲

  1. 输出流的数据可能被立即输出,也可能先暂存在缓冲区再输出。
  2. 刷新缓冲的原因:程序正常结束,作为main函数的return操作的一部分,刷新缓冲;缓冲区已满,后续数据需先刷新缓冲才能写入缓冲区;使用操纵符如endl显式刷新缓冲区;使用unitbuf设置流的内部状态来清空缓冲区,unitbuf是为cerr设置的,cerr可实现立即刷新;输出流cin、cerr被关联到另一个流cout,读写cin或写cerr会导致cout刷新缓冲区。
  3. endl换行并刷新缓冲区;flush只刷新缓冲区;ends先插入一个空字符再刷新缓冲区。
  4. unitbuf通过flush实现每次输出操作后都刷新缓冲区;nounitbuf重置流,使其或非正常缓冲方式。
  5. 若程序崩溃,输出缓冲区不会被刷新,其输出的数据可能停留在缓冲区中等待打印。
  6. 不带参数的tie返回指向输出流的指针;接受一个ostream指针的tie将自己关联到此ostream。

8.2 文件输入输出

fstream特有的操作

操作 描述
fstream fstrm; fstream是头文件fstream中定义的一个类型
创建一个未绑定的文件流
fstream fstrm(s); s是string类型或一个指向C风格字符串的指针
创建一个fstream,并打开名为s的文件
此构造函数是explicit
fstream fstrm(s, mode); mode包括in、out、app、ate、trunc、binary
创建一个fstream,按指定mode打开名为s的文件
此构造函数是explicit
fstrm.open(s); 打开名为s的文件,并将文件与fstrm绑定,返回void
fstrm.close(); 关闭与fstrm绑定的文件,返回void
fstrm.is_open(); 判断与fstrm绑定的文件是否成功打开,且尚未关闭,返回bool
  1. 头文件fstream定义3个类型来支持文件IO:ifstream从一个给定文件读取数据;ofstream向一个给定文件写入数据;fstream可以读写给定文件。

使用文件流对象

  1. C++11标准中,文件名可以是库类型string对象,也可以是C风格字符数组。旧版本只允许C风格字符数组。
  2. 调用open()失败时,failbit被置位。故最好检测open()是否打开成功。
if(out)
    //检测成功后,再使用out
  1. 若文件流已打开过文件,它调用open()会失败,并使failbit被置位。若文件流想打开其它文件,必须先关闭再打开。
  2. 当一个fstream对象离开其作用域时,与之关联的文件会自动关闭。

文件模式

文件模式 描述 前置要求 适合对象
in 以读方式打开 ifstream、fstream
out 以写方式打开 默认trunc ofstream、fstream
app 文件末尾进行写操作 默认out,无trunc ofstream、fstream
trunc 截断文件,清空文件后再进行写操作 有out ofstream、fstream
ate 打开文件后立即定位到文件末尾 任何对象
binary 以二进制方式进行IO 任何对象
  1. 单独以out模式打开文件,会默认使用trunc模式,删除旧内容。
  2. 以out+app模式或者out+in模式打开文件,可保留文件旧内容。
  3. ifstream默认以in模式打开;ofstream默认以out模式打开; fstream默认以in+out模式打开。

8.3 string流

stringstream特有操作

操作 描述
sstream strm; sstream是头文件sstream中定义的一个类型
strm是一个未绑定的stringstream对象
sstream strm(s); strm是一个sstream对象,保存string s的一个拷贝。
此构造函数是explicit。
strm.str(); 返回strm所保存的string的拷贝
strm.str(s); 将string s拷贝到strm中,返回void
  1. sstream头文件定义3个类型来支持IO:istringtream从string读取数据;ostringtream向string写入数据;stringstream对string读写数据。
  2. 整行文本处理时,可用istringtream处理行内单词;逐步构造,同一打印输出时使用ostringtream。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,406评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,976评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,302评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,366评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,372评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,457评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,872评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,521评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,717评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,523评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,590评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,299评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,859评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,883评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,127评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,760评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,290评论 2 342

推荐阅读更多精彩内容

  • #1.IO类IO对象无拷贝或赋值条件状态管理输出缓冲 #2.文件输入输出使用文件流对象文件模式 #3.string...
    MrDecoder阅读 339评论 0 0
  • 五、IO流 1、IO流概述 (1)用来处理设备(硬盘,控制台,内存)间的数据。(2)java中对数据的操作都是通过...
    佘大将军阅读 500评论 0 0
  • C/C++输入输出流总结 前两天写C++实习作业,突然发现I/O是那么的陌生,打了好长时间的文件都没有打开,今天终...
    LuckTime阅读 1,706评论 0 6
  • [转]C/C++ 文件读写操作总结 在编程的过程中,文件的操作是一个经常用到的问题,在C++Builder中,可以...
    天之道天知道阅读 5,177评论 0 7
  • IO 类 IO 库类型和头文件 头文件类型iostreamistream,wistream 从流读取数据ostre...
    赵者也阅读 390评论 0 0