C++为何建立自己的输入输出系统_第1页
C++为何建立自己的输入输出系统_第2页
C++为何建立自己的输入输出系统_第3页
C++为何建立自己的输入输出系统_第4页
C++为何建立自己的输入输出系统_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C+为何建立自己的输入输出系统 C+流类库流类库 C+为何建立自己的输入输出系统 C+的流及流类库 输入输出的格式控制 文件的输人输出 字符串流 作业 C+为何建立自己的输入输出系统 文件的输人输出 文件的概念 字符文件的访问操作 字节文件的访问操作 C+为何建立自己的输入输出系统 文件的概念 数据的输入和输出除了可以在键盘cin和显示器上cout进 行之外,还可以在磁盘上进行。磁盘是外部存储器,它 能够永久保存信息,并能够被重新读写和携带使用。在 磁盘上保存的信息是按文件的形式组织的 。 文件名 信息的机器内部表示 文件的类型 设备文件 文件的访问 文件存储与文件指针 文件的访问的准备 关闭

2、文件 C+为何建立自己的输入输出系统 文件名 每个文件都对应一个文件名。 一个文件名由文件主名和扩展名两部分组成,它们之间用圆 点(即小数点)分开,扩展名可以省略,当省略时也要省略掉前 面的圆点。 文件主名是由用户命名的一个有效的C+标识符,一般不超过 8个。 文件扩展名也是由用户命名的、1-3个字符组成的、有效的 C+标识符,通常用它来区分文件的类型。 如在C+系统中: 用户建立的用于保存数据的文件,用dat表示扩展名 由字符构成的文本文件则用txt作为扩展名, 由字节构成的、能够进行随机存取的内部格式文件则可用ran 表示扩展名。 C+为何建立自己的输入输出系统 信息的机器内部表示 字符信

3、息的机器内部(内存)表示是以一个字 节为单位的,即一个字节的二进制数( ASCII 码)表示一个字符。 数值信息的机器内部表示与字符信息不同,它 是以压缩的多字节二进制编码表示是数值信息 的。 短整型数1069的压缩的多字节二进制编码:占有两压缩的多字节二进制编码:占有两 个字节,十六进制编码为个字节,十六进制编码为04 2D。 C+为何建立自己的输入输出系统 文件的类型 文件按存储格式分为如下两种类型: 一种为字符格式文件,简称字符文件,又称 ASCII码文件或文本文件( txt作为扩展名)。 另一种为内部格式文件,简称字节文件,又称二 进制文件( ran表示扩展名)。 C+为何建立自己的输

4、入输出系统 字符文件 在字符文件中,无论是字符信息还是数值信息都是以组 成信息的最小单位-字符来表示的。即字符文件中的每 个字节单元的内容为字符的ASCII码。 所以,当从内存向字符文件输出数值数据时,需要自动 转换成它的ASCII码表示,相反,当从字符文件向内存 输入数值数据时也需要自动将它转换为内部表示 如对于一个短整型数1069: 机器内部表示占有两个字节,十六进制编码为机器内部表示占有两个字节,十六进制编码为04 2D。 字符文件占有字符文件占有4个字节,十六进制编码为个字节,十六进制编码为31 30 36 39。 如果主要是为了输出到显示器或打印机供人们阅读,或 者是为了供其他软件使

5、用时,则适宜建立成字符文件。 向字符文件输出一个换行符n时,被看做输出了回 车r和换行n两个字符;相反,从字符文件中 读取回车和换行两个连续字符时,被看成读取一个换行 符。 C+为何建立自己的输入输出系统 字节文件 字节文件中的字符信息和数值信息的格式是与机 器内部表示格式相同。所以,字节文件的输入输 出则不需要转换,仅是内外存信息的直接拷贝 。 字符信息的机器内部表示就是ASCII码表示,所 以字符信息在字符文件和字节文件的格式相同。 当建立的文件主要是为了进行数据处理时,则适 宜建立成字节文件。 C+为何建立自己的输入输出系统 设备文件 C+系统把各种外部设备也看做为相应的文件。 如把标准

6、输人设备键盘和标准输出设备显示器看 做为标准输入输出文件,其文件名(又称设备名) 为con。 当向con输出信息时就是输出到显示器,当从它 输入信息时就是从键盘输入。 标准输入输出文件con对应两个系统预定义的流, 即标准输人流cin和标准输出流cout,分别用于键 盘输入和显示器输出。 键盘和显示器都是字符格式文件。对字符文件所 介绍的访问操作也同样适用于键盘和显示器。 C+为何建立自己的输入输出系统 文件的访问 对文件的访问操作包括输入和输出两种 操作: 输入操作是指从外部文件向内存变量输入操作是指从外部文件向内存变量 输入数据,用于输入操作的文件称为输入数据,用于输入操作的文件称为 输入

7、文件。输入文件。 输出操作是指把内存变量或表达式的输出操作是指把内存变量或表达式的 值写入到外部文件中,用于输出操作值写入到外部文件中,用于输出操作 的文件称为输出文件。的文件称为输出文件。 C+为何建立自己的输入输出系统 文件存储与文件指针 一个文件中保存的内容是按存储单元的地址顺序编址的,如果一个文件中保存的内容是按存储单元的地址顺序编址的,如果 文件开始位置的字节地址文件开始位置的字节地址a,文件内容的最后一个字节的地址,文件内容的最后一个字节的地址 为为b(文件结束符占有一个字节,其值为文件结束符占有一个字节,其值为- -1 。)。)文件的长度值文件的长度值 为为b-a+1。当文件为空

8、时,开始位置和最后位置。当文件为空时,开始位置和最后位置(即文件结束符即文件结束符 位置位置)同为同为a地址位置。地址位置。 对于每个打开的文件,都存在着一个文件指针,初始指向一个对于每个打开的文件,都存在着一个文件指针,初始指向一个 隐含的位置,该位置由具体打开方式决定。隐含的位置,该位置由具体打开方式决定。 每次对文件写入或读出信息都是从当前文件指针所指的位置开每次对文件写入或读出信息都是从当前文件指针所指的位置开 始的,当写入或读出若干个字节后,文件指针就后移相应多个始的,当写入或读出若干个字节后,文件指针就后移相应多个 字节。字节。 读出的是文件内容时将返回读出的是文件内容时将返回0。

9、 当文件指针移动到最后,读出的是文件结束符时,则将使流对当文件指针移动到最后,读出的是文件结束符时,则将使流对 象调用象调用eof()成员函数返回非成员函数返回非0值值(通常为通常为1),表示文件访问结束。,表示文件访问结束。 C+为何建立自己的输入输出系统 文件的访问的准备 定义流对象 open成员函数 open_mode枚举类型中的枚举常量 文件的打开方式mode 举例 几点说明 定义文件流对象和打开文件举例 文件流对象定义语句 C+为何建立自己的输入输出系统 定义流对象 在访问文件之前都要定义一个文件流类的对象(类的 实例化),并用该对象打开文件(对象的初始化)。 fstream.h文件

10、提供了定义用户所需文件流对象的输入 文件流类ifstream、输出文件流类ofstream和输入输出 文件流类fstream。 每个文件流类都有一个声明格式完全相同的open成员 函数。 利用文件流对象调用相应类中的open成员函数,并按 照一定的打开方式打开一个文件。文件被打开后,就 可以通过流对象访问它了,访问结束后再通过流对象 关闭它。 C+为何建立自己的输入输出系统 open成员函数 open成员函数的声明格式,具体声明格式为: void open(const char *fname,int mode); 其中fname参数用于指向要打开文件的文件名 字符串,该字符串内可以带有盘符和路

11、径名, 若省略盘符和路径名则隐含为当前盘和当前路 径。 mode参数用于指定打开文件的方式,对应的实 参是ios类中定义的open_mode枚举类型中的枚 举常量,或由这些枚举常量构成的按位或表达 式。 C+为何建立自己的输入输出系统 open_mode枚举类型中的枚举常量 枚举常量的含义如下:枚举常量的含义如下: ios:in/使文件只用于数据输入,即从文件中读取数据。使文件只用于数据输入,即从文件中读取数据。 ios:out/使文件只用于数据输出,即向文件写人数据。使文件只用于数据输出,即向文件写人数据。 ios:ate/使文件指针移至文件尾,即最后位置。使文件指针移至文件尾,即最后位置。

12、 ios:app/使文件指针移至文件尾,并只允许向文件尾追加数据。使文件指针移至文件尾,并只允许向文件尾追加数据。 ios:trunc/若打开的文件存在,则清除其全部内容,使之为空若打开的文件存在,则清除其全部内容,使之为空 ios:nocreate/若打开的文件不存在则不建立它,返回失败信息。若打开的文件不存在则不建立它,返回失败信息。 ios:noreplace/若打开的文件存在,则返回打开失败信息。若打开的文件存在,则返回打开失败信息。 ios:binary/规定打开的为二进制文件,否则打开的为字符文件。规定打开的为二进制文件,否则打开的为字符文件。 C+为何建立自己的输入输出系统 文件

13、打开方式mode 举例 ios:in | ios:nocreate/*规定打开的文件是输入文件,若文 件不存在则返回打开失败信息。*/ ios:in | ios:out/规定打开的文件同时用于输入和输出。 ios:app | ios:nocreate/*规定只向打开的文件尾追加数据, 若文件不存在则返回打开失败信息。*/ ios:out | ios:noreplace/*规定打开的文件是输出文件,若 文件存在则返回打开失败信息。*/ ios:in | ios:out | ios:binary/*规定打开的文件是二进制文 件,并可同时用于输入和输出。*/ C+为何建立自己的输入输出系统 几点说明

14、 使用open成员函数打开一个文件时,若由字符指针参数 所指定的文件不存在,则就建立该文件,但新文件是一 个长度为0的空文件,但若打开方式参数中含有 ios:nocreate选项,则不建立新文件,并且返回打开失败 信息。 当打开方式中不含有ios:ate或ios:app选项时,则文件指 针被自动移到文件的开始位置。 当打开方式中含有ios:out选项,但不含有ios:in, ios:ate或ios:app选项时,若打开的文件存在,则原有内 容被清除,使之变为一个空文件。 当用输入文件流对象调用open成员函数打开一个文件时, 打开方式参数可以省略,默认按ios:in方式打开。 当用输出文件流对

15、象调用open成员函数打开一个文件时, 打开方式参数也可以省略,默认按ios:out方式打开。 C+为何建立自己的输入输出系统 定义文件流对象和打开文件举例 (1)ofstream fout; fout.open(“a:xxk.dat”);/字符串中的双反斜线表 示一个反斜线 (2)ifstream fin; fin.open(“a:wr.dat”, ios:in | ios:nocreate); (3)ofstream ofs; ofs.open(“a:xxk.dat”,ios:app); (4)fstream fio; fio.open(“a:abc.ran,ios:in | ios:ou

16、t | ios:binary); C+为何建立自己的输入输出系统 文件流对象定义语句 文件流对象定义语句与先定义文件流对象,然 后后通过流对象调用open成员函数打开文件的 功能完全相同。与上述给出的四个例子的功能 相同的文件流定义语句。 ofstream fout(“a:xxk.dat);/定义文件流对象 的同时赋值 ifstream fin(“a:wr.dar,ios:in l ios:nocreate); ofstream ofs(“a:xxk.dat,ios:app); fstream ofs(“a:abc.ran”,ios:in | ios:out | ios:binary); C+

17、为何建立自己的输入输出系统 关闭文件 每个文件流类中都提供有一个关闭文件的成员 函数close(),当打开的文件操作结束后,就需 要关闭它,使文件流与对应的物理文件断开联 系。 文件流对应的文件被关闭后,还可以利用该文 件流调用open成员函数打开其他的文件。 关闭任何一个流对象所对应的文件,就是用这 个流对象调用close()成员函数即可。如要关闭 fout流所对应的“a:xxk.dat”文件,则关闭语句 为: fout.close(); C+为何建立自己的输入输出系统 字符文件的访问操作 当只需要对数据进行顺序输入输出操作 时,适合使用字符文件。 对字符文件的访问操作包括向字符文件 顺序输

18、出数据和从字符文件顺序输入数 据这两个方面。 顺序输出数据 顺序输入数据 C+为何建立自己的输入输出系统 顺序输出 顺序输出就是依次把数据写入到文件的末尾(当 然文件结束符也随之后移,它始终占据整个文 件空间的最后一个字节位置). 向字符文件输出数据有如下两种方法: 调用从调用从ostream流类中继承来的插入操作流类中继承来的插入操作 符重载函数符重载函数: 调用从调用从ostream流类中继承来的流类中继承来的put成员函成员函 数。数。 C+为何建立自己的输入输出系统 插入操作符重载函数插入操作符重载函数 声明格式如下: ostream &operator“成员函数成员函数 调用调用ge

19、t()成员函数成员函数 调用调用getline成员函数成员函数 成员函数peek()和putback(char) 上述各种成员函数都是在上述各种成员函数都是在istream流类中定义的,它们流类中定义的,它们 都被每一种文件流类继承了下来,所以文件流类的对都被每一种文件流类继承了下来,所以文件流类的对 象可以直接调用它们。象可以直接调用它们。 cin和和cout流对象所属的流类也分别是流对象所属的流类也分别是istream流类和流类和 ostream流类的派生类,所以流类的派生类,所以cin和和cout也可以直接调也可以直接调 用相应流类中的成员函数。用相应流类中的成员函数。 C+为何建立自己

20、的输入输出系统 调用提取操作符重载成员函数 每次从文件流中提取用空白符隔开(最后一个数据以文 件结束符为结束标志)的一个数据,在读取一个数据前 文件指针自动跳过空白字符,向后移到非空白字符时读 取一个数据。 声明格式 : istream &operator(简单类型&); 从流中提取一个数据到引用对象中 当使用流对象调用提取操作符重载成员函数时,若提取 成功则返回非0值,若提取失败(即已经读到文件结束符, 未读到文件内容)则返回0值。 一般,若一个文件是使用插入操作符输出数据而建立的, 则当做输入文件打开后,应使用提取操作符输人数据; 举例(见备注页) C+为何建立自己的输入输出系统 调用ge

21、t()成员函数 调用调用get()成员函数,每次从文件流中提取一个字符成员函数,每次从文件流中提取一个字符(不跳过任何不跳过任何 字符,当然回车和换行两个字符被作为一个换行字符看待字符,当然回车和换行两个字符被作为一个换行字符看待)并作并作 为返回值返回;为返回值返回; 调用调用get(char&)成员函数,每次从文件流中提取一个字符到引用成员函数,每次从文件流中提取一个字符到引用 变量中,同样不跳过任何字符。变量中,同样不跳过任何字符。 声明格式声明格式 : int get()int get();/返回从流中提取到的一个字符返回从流中提取到的一个字符 istream &get(char&);

22、/从流中提取一个字符到字符引用中从流中提取一个字符到字符引用中 当使用流对象调用当使用流对象调用get()get()成员函数时,通过判断返回值是否等于成员函数时,通过判断返回值是否等于 文件结束符文件结束符EOFEOF可知文件中的数据是否被输入完毕。可知文件中的数据是否被输入完毕。 一般,若一个文件是使用一般,若一个文件是使用put成员函数输出字符而建立的,则当成员函数输出字符而建立的,则当 作输入文件打开后,应使用作输入文件打开后,应使用get()或或getget(char&)成员函数输入字符成员函数输入字符 数据。数据。 举例(见备注页举例(见备注页) C+为何建立自己的输入输出系统 调用

23、getline成员函数 调用getline(char*buffer,int len,char= n)成员 函数,每次从文件流中提取以换行符隔开(最后 一行数据以文件结束符为结束标志)的一行字符 到字符指针buffer所指向的存储空间中,若碰到 换行符之前所提取字符的个数大于等于参数len 的值,则本次只提取len1个字符,被提取的一 行字符是作为字符串写入到buffer所指向的存储 空间中的,也就是说在一行字符的最后位置必须 写入0.字符。 声明格式 : C+为何建立自己的输入输出系统 声明格式 声明格式: istream &getline(char* buffer,int len,char=

24、n); /从流中提取一行字符到由字符指针所指向的存储空间中从流中提取一行字符到由字符指针所指向的存储空间中 当使用流对象调用getline成员函数时,若提取 成功则返回非0值,若提取失败(即已经读到文 件结束符,未读到文件内容)则返回0值 一般,若每次需要从一个输入文件中读人一行 字符时,则需要使用getline成员函数。 举例(见备注页) C+为何建立自己的输入输出系统 成员函数peek()和putback(char) 在istream流类中还有两个成员函数peek()和 putback(char)供输入文件流对象和cin对象调用。 当调用peek()成员函数时返回一个整数值,它是从流 中提

25、取一个字符的ASCII码,但利用它提取字符后, 文件指针不向后移动,而是仍停留在原有位置上。 当调用putback(char)成员函数时,将当前文件指针所 指字符的位置移到前一个字符位置上,使得输入流状 态恢复为最近一次提取字符前的状态。 例见备注页 C+为何建立自己的输入输出系统 字节文件的访问操作 字节文件是指在打开方式中带有ios:binary选项 的文件。字节文件可以是输入文件、输出文件、 既输入又输入的文件。 文件指针 向字节文件中输出信息 从字节文件中输入信息 C+为何建立自己的输入输出系统 文件指针 文件指针的作用 seekg和seekp成员函数 tellg()和tellp()成

26、员函数 C+为何建立自己的输入输出系统 文件指针的作用 在每个文件中都存在着一个文件指针,用以指出 文件当前的读写位置。 向字节文件中输出信息,就是把内存中由字符指 针所指向的定字节数的内容,从文件中当前文 件指针所指位置向后存放,然后文件指针被自动 后移所写入内容的字节数。 从字节文件中输入信息,就是从当前文件指针所 指位置开始读出一定字节数的内容,然后拷贝到 内存中由字符指针所指向的存储空间中,然后文 件指针被自动后移所读出内容的字节数。 C+为何建立自己的输入输出系统 seekg和seekp成员函数 利用istream流类中提供的seekg成员函数能够把 输入文件中文件指针移动到指定的位

27、置上;利用 ostream流类中提供的seekp成员函数能够把输出 文件中的文件指针移动到指定的位置上;若一个 文件既按输入又按输出打开,则既可以使用 seekg又可以使用seekp移动文件指针。 成员函数的声明格式 C+为何建立自己的输入输出系统 seekg和seekp声明格式 声明格式如下: istream &seekg(long dis,seek_dir ref=ios:beg); ostream &seekp(long dis,seek_dir ref=ios:beg); seek_dir是一个在是一个在ios根基类中定义的枚举类型,它包含根基类中定义的枚举类型,它包含 有三个常量:有

28、三个常量:ios:beg,ios:cur和和ios:end。 ref参数的作用是指定移动文件指针的参考点,当分别参数的作用是指定移动文件指针的参考点,当分别 取取ios:beg,ios:cur或或ios:end时,则参考点分别为文件时,则参考点分别为文件 开始位置、当前文件指针位置和文件结尾位置。开始位置、当前文件指针位置和文件结尾位置。 用文件流对象调用上述一个函数后,文件指针被移到距用文件流对象调用上述一个函数后,文件指针被移到距 离参考点离参考点ref的的abs(dis)个字节的位置上,当个字节的位置上,当dis为正时则为正时则 表示后移,为负时则表示前移。(讨论见备注页)表示后移,为负

29、时则表示前移。(讨论见备注页) ios:beg常量是常量是ref参数的默认值。调用函数时可以只使参数的默认值。调用函数时可以只使 用一个实参,此时将使文件指针移到字节地址为实参值用一个实参,此时将使文件指针移到字节地址为实参值 的位置上。的位置上。 C+为何建立自己的输入输出系统 tellg()和tellp()成员函数 在istream流类定义有tellg() 成员函数供文件流调 用,用来分别返回输入文件文件指针的位置,即 对应的字节地址。 在ostream流类中定义有tellp()成员函数供文件流 调用,用来输出文件中文件指针的位置,即对应 的字节地址。 对于输入又按输出方式打开的文件,为了

30、返回当 前文件指针位置,既可以调用tellg(),也可用 tellp()实现。 C+为何建立自己的输入输出系统 向字节文件中输出信息 一个文件被用户定义的一个文件流对象打开后, 通过文件流对象调用在ostream流类中定义的 write成员函数能够向文件流对象所对应的文件中 写入信息。 write成员函数的声明格式如下: ostream &write(const char*buffer,int len); 其中字符指针其中字符指针buffer用于存放内存中保存文件读用于存放内存中保存文件读 写信息的一块存储空间的首地址,整型参数写信息的一块存储空间的首地址,整型参数len 用于存放一次读写文件

31、的字节数。用于存放一次读写文件的字节数。 例见备注页例见备注页 C+为何建立自己的输入输出系统 从字节文件中输入信息 一个文件被用户定义的一个文件流对象打开后,通过文 件流对象调用在istream流类中定义的read成员函数能够 从文件流对象所对应的文件中读出信息, read成员函数的声明格式如下: istream &read(char* buffer,int len); buffer内存中用于存放保存文件读写信息的一块存储空 间的首地址,len用于存放一次读文件的字节数。当调用 read成员函数时若读到了len个字节内容,则返回非0值, 若读到了文件结束符,则返回0值,此时通过调用 istream流类中提供的gcount()成员函数能够返回实际读 取的字节数。 例见备注页 C+为何建立自己的输入输出系统 字符串流 字符串流类概念 字符串流类的构造函数 关联字符串流类与字符数组 定义相应字符串流的例子 举例 C+为何建立自己的输入输出系统 字符串流类概念 字符串流类包括

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论