C++ Primer 第四版读书笔记(七)之标准IO库

C++的输入/输出由标准库提供。标准库定义了一组类型,支持对文件和控制窗口等设备的读写(IO)。还定义了其他一些类型,使string对象能够像文件一样操作,从而使我们无需IO就能实现数据与字符之间的转换。一般来说,类的设计者还可以很方便地使用IO标准库设施读写自定义类的对象。类类型通常使用IO标准库为内置类型定义的操作符和规则来进行读写。

一、面向对象的标准库

迄今为止,我们已经使用IO类型和对象读写数据流,它们常用于与用户控制窗口的交互。当然,实际的程序不能仅限于对控制窗口的IO,通常还需要读或写已命名的文件。此外,程序还应该能方便地使用IO操作格式化内存中的数据,从而避免读写磁盘或其他设备的复杂性和运行代价。应用程序还需要支持宽字符语言的读写。

一般而言,通过继承关联起来的类型都共享共同的接口。当一个类继承另一个类时,这两个类通常可以使用相同的操作。更确切地说,如果两种类型存在继承关系,则可以说一个类“继承”了其父类的行为——接口。

IO类型在三个独立的头文件中定义:iostream定义读写控制窗口的类型,fstream定义读写已命名文件的类型,而sstream所定义的类型则用于读写存储在内存中string对象。在fstream和sstream里定义的每种类型都是从iostream头文件中定义的相关类型派生而来。

对IO类型使用继承还有另外一个重要的含义:如果函数有基类类型的引用形参时,可以给函数传递其派生类型的对象。这就意味着:对istream&进行操作的函数,也可使用ifstream或者istringstream对象来调用。

1.1 国际字符的支持

每一个IO头文件都定义了char和wchar_t类型的类和标准输入/输出对象。基于流的wchar_t类型的类和对象在iostream中定义,宽字符文件流类型在fstream中定义,而宽字符stringstream则在sstream头文件中定义。

1.2 IO对象不可复制或赋值

一般情况下,如果要传递IO对象以便对它进行读写,可用非const引用的方式传递这个流对象。对IO对象的读写会改变它的状态,因此引用必须是非const的。

二、条件状态

实现IO的继承正式错误发生根源。一些错误是可恢复的;一些错误则是发生在系统底层,位于程序可修正的范围之外。IO标准库管理一些列条件状态成员,用来标记给定的IO对象是否处于可用状态,或者碰到了哪种特定的错误。

IO标准库的条件状态
函数 标记
strm::iostate 机器相关的整型名,由各个iostream类定义,用于定义条件状态
strm::badbit strm::iostate类型的值,用于指出被破坏的流
strm::failbit strm::iostate类型的值,用于指出失败的IO操作
strm::eofbit strm::iostate类型的值,用于指出流已经达到文件结束符
s.eof() 如果设置了流s的eofbit值,则该函数返回true
s.fail() 如果设置了流s的failbit值,则该函数返回true
s.bad() 如果设置了流s的badbit值,则该函数返回true
s.good() 如果流s处于有效状态,则该函数返回true
s.clear() 将流s中的所有状态值都重设为有效状态
s.clear(flag) 将流s中的某个指定条件状态设置为有效。flag的类型是strm::iostate
s.setstate(flag) 给流s添加指定条件。flag的类型是strm::iostate
s.rdstate() 返回流s的当前条件,返回值类型为strm::iostate

2.1条件状态

所有流对象都包含一个条件状态成员,该成员由setstate和clear操作管理。

2.2 流状态的查询和控制

三、输出缓冲区的管理

3.1 输出缓冲区的刷新

endl:用于输出一个换行符并刷新缓冲区

flush:用于刷新流,但不在输出中调价任何字符

ends:比较少用,在缓冲区中插入空字符null,然后再刷新它

3.2 unitbuf操纵符

如果需要刷新都有输出,最好使用unitbuf操纵符。这个操纵符在每次执行完些操作后都刷新流。

3.3 将输入和输出绑定在一起

交互式系统通常应确保它们的输入和输出流是绑定在一起的。这样做意味着可以保证任何输出,包括给用户的提示,都在试图读之前输出。

四、文件输入和输出

fstream头文件定义了三种支持文件IO的类型:

(1)ifstream,由istream派生而来,提供读文件的功能;

(2)ofstream,由osteam派生而来,提供写文件的功能;

(3)fstream,由iostream派生而来,提供读写同一个文件的功能。

4.1文件流对象的使用

需要读写文件时,则必须定义自己的对象,并将他们绑定在需要的文件上。

在使用fstream对象之前,还必须使这些对象捆绑要读写的文件。

调用open成员函数将已存在的fstream对象与特定文件绑定。为了实现读写,需要将指定的文件打开并定位,open函数完成系统指定的所有需要的操作。

4.1.1 检查文件打开是否成功

打开文件后,通常要检验打开是否成功,这是一个好习惯。

ifstream infile;

infile.open("in");

if(!infile)

{

...........................

return -1;

}

4.1.2 将文件流与新文件重新捆绑

fstream对象一旦打开,就保持与指定的文件相关联。如果要把fstream对象与另一个不同的文件关联,则必须先关闭(close)现有的文件,然后打开(open)另一个文件。

4.1.3 清除文件流的状态

如果程序员需要用文件流读写多个文件,必须在读另一个文件之前调用clear清除该流的状态。

4.2 文件模式

在打开文件时,无论是调用open还是以文件名作为流初始化的一部分,都需要指定文件模式。每个fstream类都定义了一组表示不同模式的值,用于指定流打开的不同模式。与条件状态标识一样,文件模式也是整型常量。文件流构造函数和open函数都提供了默认实参设置文件模式。

文件模式
in 打开文件做读操作
out 打开文件做写操作
app 在每次写之前找到文件尾
ate 打开文件后立即将文件定位在文件尾
trunc 打开文件时清空已存在的文件流
binary 以二进制模式进行IO操作

out、trunc和app模式只能用于指定与ofstream或fstream对象关联的文件;in模式只能用于指定与ifstream或fstream对象所关联的文件。所有的文件都可以使用ate或binary模式打开。ate模式只在打开时有效:文件打开后将定位到文件尾。以binary模式打开的流则将文件以字节序列的形式处理,而不解释流中的字符。

默认时,与ifstream流对象关联的文件以in模式打开,该模式允许文件做读的操作;与iostream关联的文件则以out模式打开,是文件可写。以out模式打开的文件会被清空:丢弃该文件存储的所有数据。

注:从效果来看,为ofstream对象执行out模式等效于同时指定了out和trunc模式。

4.2.1 对同一个文件作输出和输入运算

默认情况下,fstream对象以in和out模式同时打开。当文件同时以in和out打开时不清空。如果打开fstream所关联的文件时,只使用out模式,而不指定in模式,则文件会清空已存在的数据。如果打开文件时指定了trunc模式,则无论是否同时指定了in模式,文件同样会被清空。

4.2.2 模式是文件的属性而不是流的属性

注:只要调用open函数,就要设置文件模式,其模式的设置可以是显式的也可以是隐式地。如果没有指定文件模式,将使用默认值。

4.2.3 打开模式的有效组合

并不是所有的打开模式都是可以同时指定。有些模式组合式没有意义的:

文件模式的组合
out 打开文件做写操作,删除文件中已有的数据
out | app 打开文件做写操作,在文件尾写入
out | trunc 与out模式相同
in 打开文件做读操作
in | out 打开文件做读、写操作,并定位于文件开头处
in | out | trunc 打开文件做读、写操作,删除文件中已有的数据

4.3 一个打开并检查输入文件的程序

五、字符串流

时间: 2024-10-27 13:01:28

C++ Primer 第四版读书笔记(七)之标准IO库的相关文章

C++ Primer 第四版读书笔记(四)之表达式

表达式由一个或多个操作数通过操作符组合而成.最简单的表达式仅包含一个字面值常量或变量.较复杂的表达式则由操作符以及一个或多个操作数构成. 每个表达式都会产生一个结果.如果表达式中没有操作符,则其结果就是操作数本身的值.当一个对象用在需要使用其值的地方,则计算该对象的值. 操作符的含义--该操作符执行什么操作以及操作结果的类型--取决于操作数的类型. C++提供了一元操作符和二元操作符两种操作符.作用在一个操作数上的操作符称为一元操作符.如曲地址符(&)和解引用操作符(*):而二元操作符则作用于两

C++ Primer 第四版读书笔记(八)之顺序容器

容器容纳特定类型对象的集合. 标准库vector类型,是一个顺序容器.它将单一类型元素聚集起来称为容器,然后根据位置来存储和访问这些元素,这就是顺序容器.顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定. 标准库定义了三种顺序容器类型:vector.list和deque.它们的差别在于访问元素的方式,以及添加或删除元素相关操作的运行代价.标准库还提供了三种容器适配器.实际上,适配器是根据原始的容器类型所提供的操作,通过定义新的操作接口,来适应基础的容器类型. 顺序容器类型 顺

C++ Primer 第四版读书笔记(六)之函数

内联函数.类成员函数和重载函数以及函数指针. 函数可以看作程序员定义的操作.与内置操作符相同的是,每个函数都会实现一系列的计算,然后(大多数时候)生成一个结算结果.但与操作符不同的是,函数有自己的函数名,而且操作数没有数量限制.与操作符一样,函数可以重载,这意味着同样的函数名可以对应对个不同的函数. 一.函数的定义 函数由函数名以及一组操作数类型唯一地表示.函数的操作数,也即形参(parameter),在一对圆括号中声明,形参与形参之间以逗号分隔.函数执行的计算在一个称为函数体(function

C++ Primer 第四版读书笔记(五)之语句

通常情况下,语句是顺序执行的.但是,除了最简单的程序外,只有顺序执行往往并不足够.为此,C++定义了一组控制流语句,允许有条件地执行或者重复地执行某部分功能. 1.1 简单语句 C++中,大多数语句以分号结束. 表达式语句用于计算表达式. 1.2 声明语句 在C++中,对象或类的定义或声明也是语句. 1.3 复合语句 复合语句,通常被称为块,使用一对花括号括起来的语句序列.块标识了一个作用域,在块中引入的名字只能在该块内部或者嵌套在块中的子块里访问.通常,一个名字只从其定义处到该块结尾这段范围内

C++ Primer 第四版读书笔记(三)之数组与指针

C++语言提供了两种类似于vector和迭代器类型的低级复合类型--数组与指针.与vector类型相似,数组也可以保存某种类型的一组对象:而它们的区别在于,数组的长度是固定的.数组一经创建,就不允许添加新的元素.指针则可以像迭代器一样用于遍历和检查数组中的元素. 现代C++程序应尽量使用vector和迭代器类型,而避免使用低级的数组和指针.设计良好的程序只有在强调速度时才在类实现的内部使用数组和指针. 数组是C++语言中类似于标准库vector类型的内置数据结构.与vector类似,数组也是一种

C++ Primer 第四版读书笔记(八)之顺序容器(续)

3.6 访问元素 如果容器非空,那么容器类型的front和back成员将返回容器内第一个或最后一个元素的引用. 访问顺序容器内元素的操作 c.back() 返回容器c的最后一个元素的引用.如果c为空,则该操作未定义 c.front() 返回容器c的第一个元素的引用.如果c为空,则该操作未定义 c[n] 返回下标为n的元素的引用 如果n<0或n>c.size(),则该操作未定义 只适用于vector和deque容器 c.at[n] 返回下标为n的元素的引用.如果下标越界,则该操作未定义 只适用于

C++ Primer 第四版读书笔记(一)之变量和基本类型

C++语言定义了几种基本类型:字符型.整形.浮点型等. 1.基本内置类型 C++定义了一组表示整数.浮点数.单个字符和布尔值的算术类型,另外还定义了一种称为void的特殊类型. 表1.1 C++:算术类型 类型 含义 最小存储空间 bool 布尔型 - char 字符型 8位 wchar_t 宽字符型 16位 short 短整型 16位 int 整形 16位 long 长整形 32位 float 单精度浮点型 6位有效数字 double 双精度浮点型 10位有效数字 long double 扩展

C++ Primer 第四版读书笔记(二)之标准库类型

C++定义了一个内容丰富的抽象数据类型标准库,其中最重要的标准库类型是string和vector,它们分别定义了大小可变的字符串和集合.string和vector往往将迭代器用作配套类型,用于访问string中的字符,或者vector中的元素. 另一种标准库类型为bitset,提供了一种抽象方法来操作位的集合. string类型支持长度可变的字符串,vector用于保存一组指定类型的对象. bitset类标准库类型提供了更方便和合理有效的语言级的抽象设施.通过这个类可以把某个值当作位的集合来处理

Java编程思想第四版读书笔记——第十三章 字符串

Java编程思想第四版读书笔记--第十三章 字符串 字符串的操作是计算机程序设计中最常见的行为. 关键词: StringBuilder ,StringBuffer,toString(),format转换,正则表达式, 1.不可变String String对象时不可变的.每当把String对象作为方法的参数时,都会复制一份引用.(其实就是对函数中参数列表中参数的操作不会影响外面的原参数) 如下: import static net.mindview.util.Print.*; public cla