C及C++程序设计 教学课件 ppt 作者 张富 第十九章

上传人:E**** 文档编号:89344904 上传时间:2019-05-23 格式:PPT 页数:37 大小:106.50KB
返回 下载 相关 举报
C及C++程序设计 教学课件 ppt 作者  张富 第十九章_第1页
第1页 / 共37页
C及C++程序设计 教学课件 ppt 作者  张富 第十九章_第2页
第2页 / 共37页
C及C++程序设计 教学课件 ppt 作者  张富 第十九章_第3页
第3页 / 共37页
C及C++程序设计 教学课件 ppt 作者  张富 第十九章_第4页
第4页 / 共37页
C及C++程序设计 教学课件 ppt 作者  张富 第十九章_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《C及C++程序设计 教学课件 ppt 作者 张富 第十九章》由会员分享,可在线阅读,更多相关《C及C++程序设计 教学课件 ppt 作者 张富 第十九章(37页珍藏版)》请在金锄头文库上搜索。

1、第十九章 C+的I/O系统,19.1 C+的I/O系统概述 19.2 定义自己的插入操作符和提取操作符 19.3 格式化 I/O 19.4 文本文件的I/O 19.5 二进制文件的I/O 19.6 文件的随机访问,19.1 C+的I/O系统概述 19.1.1 流与文件 和+的I/O系统有一个重要的共同点,就是它们都是在流上操作。这个共同点,使得在同一个程序中,可以同时使用和+的I/O操作。 在和+的I/O系统中,流分为两类:文本流和二进制流。文本流是一个字符序列。在文本流中,可能发生字符转换。二进制流则是一组字节序列。它与设备上的输入输出一一对应,没有进行任何转换。,一个流与特定文件的联系,是

2、通过“打开”操作建立起来的。文件一打开,程序就可以同文件交换信息了。通过“关闭”操作,可以将流与特定的文件之间的联系断开。当流的打开是用于输出时,关闭操作将使相关缓冲区的信息写到外部设备上。这个过程称为刷新流。程序正常结束时,所有打开的文件都自动关闭。,19.1.2 C+的流 C+流I/O是以类层次的方式实现的。基类是一个流,它可以表示文件或I/O设备。它定义了使用者看不见的低层操作。使用者接触的是由派生类定义的高层次的I/O函数。 +有四个预定义流,当+程序开始执行时,它们会自动打开。这四个预定义流是: 标准输入流 cin; 标准输出流 cout; 非缓冲型标准出错流 cerr; 缓冲型标准

3、出错流 clog。,C+提供的流I/O的一个明显优点,就是程序员可以不考虑数据的类型。例如,输出变量a的值 couta; 和输入变量b的值 cinb; 这里变量a和变量b的数据类型可能是int, char, float等等。,19.2 定义自己的插入操作符和提取操作符,到目前为止,当需要输入或输出与类有关的数据时,是通过建立专门的成员函数实现的。这种方法不太方便。+提供了更好的方法。这就是用重载操作符“”来完成类的I/O操作。 19.2.1 创建插入符,例 19.2.1 为下面的类my_data定义插入符“”,使其能输出该类的三个数据i, f, c。 类my_data的定义如下: class

4、my_data public : int i; float f; char ch; set_val(int a, cloat b, char ch) i = a; f = b; ch = c; ;,为创建类my_data 的对象的插入符函数,其功能为输出类my_data对象的三个数据i,f,ch。可重载“”操作符如下: ostream ,这个函数的返回类型是一个对类ostream的对象的引用(ostream ,重载插入符函数不能是类的成员函数。否则,就会假设左操作数(通过this指针隐含传送)是调用操作符函数的类的对象。但重载插入符的左边参数是流,而右边参数是类的对象。,19.2.2 重载提取

5、符 重载提取符“”的方法是和重载插入符“(istream 同插入符函数一样,提取符函数也不能是所操作类的成员函数。它或者是友元函数或者是独立的函数。,例 19.2.4 为例19.2.1定义的类my_data创建提取符函数,使其接收从键盘输入的类数据成员的数据。 函数定义如下: istream ,19.3 格式化 I/O,在前面C+程序中所使用的I/O流都是无格式的。数据的输入和输出格式,都是由提取操作符和插入操作符缺省规定的。+有两种格式化输出输入方法:第一种方法是使用ios类的成员函数, 第二种方法是使用一种称为控制器的特殊函数。本节分别讨论这两种方法。 19.3.1 用ios类的成员函数实

6、现格式化输出,例 19.3.1 应用标志设置的例子: #include main() double d = 123.456789; int i = 12345; cout.setf(ios:showpos); cout.setf(ios:scientific); cout.setf(ios:showbase); cout.setf(ios:hex);,程序的输出为: +1.234567e+o2 0x3039 例中用四个语句设置的四个标志。也可以写成如下的一个语句: cout.setf(ios:showpos|ios:scientific|ios:hex|ios:showbase);,19.3.

7、2 使用控制器函数实现格式化I/O 为了使用控制器函数,程序中需要包含头文件iomanip.h。标准控制器函数列于表19.3.1中。 所有控制器都将它们当前影响的流作为一个参数并返回这个流,以这种方式,控制器可以作为I/O表达式的一部分。 例如,设置小数位数为位时,可以这样写: cout setprecision(5);,19.4 文本文件的I/O,+有三种流类:输入流类(ifstream),输出流类(ofstream)和输入输出流类(fstream)。这些类分别定义了输入方式,输出方式,输入与输出方式访问文件所需要的所有文件。,19.4.1 打开和关闭文件 打开文件就是将文件与创建的流对象联

8、系起来,使之能够进行读写文件的操作。关闭文件就是断开它们之间已存在的联系,使之不能进行文件的读写操作。 1. 打开文件 有两种打开文件的方法。现分述如下: (1) 使用函数 open() 可使用函数open()打开一个文件。此函数是上述三个流类的成员,其原型为: void open(char *filename, int mode, int access);,(2) 利用构造函数打开文件 +的ifstream, ofstream和fstream三个流类均定义了自动打开文件的构造函数。构造函数的参数及默认值与上面介绍的函数open()相同。因此,要想通过流对象mystream打开一个用于输入的文

9、件“myfile”,可用如下的语句实现: ifstream mystream(“myfile“); 如果文件打开失败,流变量的值为0。,2. 关闭文件 关闭文件要使用成员函数close()。 例如,要关闭连在流mystream上的文件“myfile”,使用如下的语句: mystream.close(); 函数close()不带参数,也没返回值。,19.4.2 文本文件的读和写 文本文件的读和写是非常简单的事。文件打开后,只要使用操作符“”便可进行读写文件。,例 19.4.2 将例19.4.2中建立的文件“Myfile”读出并显示在显示器的屏幕上。 程序首先将文件以读的方式打开,然后读文件,最后

10、输出数据。程序如下: #include #include main() ifstream in(“myfile“); if(!in) cout “cannot open myfile.n“; return 1; ,char c; int i; float f; char str180; char str280; char str380; in ifc; in str1; in str2; in str3;,cout i“ “f“ “cendl; cout str1 endl; cout str2 endl; cout str3 endl; in.close(); return 0; 程序的输出

11、如下: 123 123.123456 A *123 *1.123 This_is_myfile.,19.4.3 检测文件尾 在文件的I/O操作中,如读一个文件,可能需要检测是否读到文件的尾部。这个检测可用eof()函数实现。该函数的原型为: int eof(); 到达文件尾时,返回一个非零值,否则返回零值。此函数也用于二进制文件中。,例 19.4.3 编写程序,拷贝例19.4.2中建立的文件“myfile”。拷贝的文件名为“filecopy”。 程序的过程是这样:首先以输入方式打开文件“myfile”;其次,建立用于输出的新文件“filecopy”;再其次,将文件“myfile”的内容逐个字符

12、的读入并写入文件“filecopy”;最后,关闭打开的两个文件。 在读文件“myfile”的过程中,需要不断地用函数eof()检查是否读到文件尾。如果读到文件尾,便立即结束读文件操作。,程序如下: #include #include main() ifstream in(“myfile“); if(!in) cout “cannot open myfile.n“; return 1; ofstream out(“filecopy“); if(!out) cout “cannot open filecopy.n“; return 1; ,char c; while(!in.eof() inc;

13、outc; in.close(); out.close(); return 0; ,19.5 二进制文件的I/O,+提供了两种方式的二进制文件读写:字节方式的读写和数据块方式的读写。 19.5.1 字节方式的读写 字节方式下,读二进制文件,可用get()函数进行。其原型为: ifstream 函数put()将字符写到流中,返回该流。,例 19.5.1 用函数put()将一个字符串写到文件“myfile”中: #include #include main() ofstream out(“myfile“); if(!out) cout “Cannot open myfile.n“; return

14、1; ,char str = “123.45 my data“; char *ptr = str; while(*ptr) out.put(*ptr+); out.close(); return 0; ,19.5.2 块方式的读写 为实现读二进制数据块,可使用+的成员函数read();为实现写二进制数据块,可使用+的成员函数和write()。它们的原型分别为: ifstream 函数read()从流中读取num个字节数据并存放到指针buf所指的缓冲区中。函数返回该流, 当到达文件尾时,该流变为0。 函数write()将buf所指的缓冲区的num个字节的数据写入流中并返回该流。一般可用被读写的数

15、据的存储区地址作为写缓冲区的指针buf。,19.6 文件的随机访问,在+的I/O系统中,对应一个文件,有两个指针:一个是读指针,它说明输入操作在文件中的位置;另一个是写指针,它说明下次写操作的位置。 在流I/O中有两个函数用于设置访问文件的指针位置:它们是成员函数seekg()和seekp()。使用函数seekg()和seekp()就可以任意改变上述指针的位置,从而实现非顺序地(即随机地)访问文件。,这两个函数的原型为: ifstream 函数seekg()用于控制读指针,函数seekp()用于控制写指针。,表19.6.1,函数 seekg( ) 将相应文件的读指针从origin说明的位置移动offset个字节,origin必须取表19.6.1中的三个值之一。 函数 seekp( ) 将相应文件的写指针从origin说明的位置移动offset个字节,origin也必须取表19.6.1中的三个值之一。 因为随机文件的访问一般采用二进制模式,所以,可以用前面介绍过的函数put()、get()、write()、read()进行文件的读和写。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号