第7章_输入输出流_第1页
第7章_输入输出流_第2页
第7章_输入输出流_第3页
第7章_输入输出流_第4页
第7章_输入输出流_第5页
已阅读5页,还剩46页未读, 继续免费阅读

下载本文档

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

文档简介

1、2022-5-2717.1 C+的输入和输出的输入和输出 7.2 标准输出流标准输出流 7.3 标准输入流标准输入流7.4 文件操作与文件流文件操作与文件流7.5 字符串流字符串流2022-5-272【目的要求目的要求】1.理解I/O流的概念。2. 熟悉标准输出流。3. 熟悉标准输入流。4. 使用流类库进行文件存取的方法。【重点重点】1. 流类库的概念。2. 文件操作与文件流。【难点难点】文件流2022-5-2737.1 C+的输入和输出的输入和输出7.1.1 输入输出的含义输入输出的含义程序的输入程序的输入:指的是从输入文件将数据传送给:指的是从输入文件将数据传送给程序;程序;程序的输出程序

2、的输出:指的是从程序将数据传送:指的是从程序将数据传送给输出文件。给输出文件。C+的输入与输出包括:的输入与输出包括:(1)标准的输入输出标准的输入输出,简称,简称标准标准I/O。即从键盘。即从键盘 输入数据,输出到显示器。输入数据,输出到显示器。(2)文件的输入输出文件的输入输出,简称,简称文件文件I/O。以外存文。以外存文 件为对象的输入输出。件为对象的输入输出。(3)字符串输入输出字符串输入输出,简称,简称串串I/O。对内存中指。对内存中指 定的空间进行输入和输出。定的空间进行输入和输出。2022-5-2747.1.2 C+的的I/O对对C的发展的发展类型安全和可类型安全和可扩展性扩展性

3、 在在C+的输入输出中,编译系统对数据类的输入输出中,编译系统对数据类型进行严格的检查,凡是类型不正确的数据都型进行严格的检查,凡是类型不正确的数据都不可能通过编译,因此,不可能通过编译,因此,C+的的I/O操作是类型操作是类型安全的。安全的。 C+的的I/O操作是可扩展的,不仅可以用来操作是可扩展的,不仅可以用来输入输出标准类型的数据,也可以用于用户自输入输出标准类型的数据,也可以用于用户自定义类型的数据。可扩展性是定义类型的数据。可扩展性是C+输入输出的输入输出的重要特点之一,它能提高软件的重要性,加快重要特点之一,它能提高软件的重要性,加快软件的开发过程。软件的开发过程。2022-5-2

4、757.1.3 C+的输入输出流的输入输出流 流流是一种抽象,它负责在数据的是一种抽象,它负责在数据的生产生产者者和数据的和数据的消费者消费者之间建立联系,并管理之间建立联系,并管理数据的流动。数据的流动。 在输入操作时,字节流从输入设备在输入操作时,字节流从输入设备(如如键盘、磁盘等键盘、磁盘等)流向内存流向内存;在输出操作时,;在输出操作时,字节流从字节流从内存流向输出设备内存流向输出设备(如屏幕、打印如屏幕、打印机、磁盘等机、磁盘等)。 在在C+中,输入输出被定义为类。中,输入输出被定义为类。C+的的I/O库中的类称为库中的类称为流类流类,用流定义的,用流定义的2022-5-276对象称

5、为对象称为流对象流对象。1. iostream类库中有关的类类库中有关的类2022-5-277输入输出流及其文件流见如图所示:输入文件流类输入文件流类输出文件流类输出文件流类通用输入流通用输入流通用输出流通用输出流通用输入输出流通用输入输出流输入输出文件流类输入输出文件流类抽象基类抽象基类2022-5-2782. 与与iostream类库有关的头文件类库有关的头文件头文件是程序与类库的接口,头文件是程序与类库的接口,iostream类库的类库的接口分别由不同的头文件来实现,常见的有:接口分别由不同的头文件来实现,常见的有:iostream 包含了对包含了对输入输出流输入输出流进行操作所需要进行

6、操作所需要 的基本信息。的基本信息。fstream 用于用户管理的用于用户管理的文件文件的的I/O操作。操作。strstream 用于用于字符串流字符串流I/O。stdiostream 用于混合使用用于混合使用C和和C+的的I/O机制机制 时,例如想将时,例如想将C程序转变为程序转变为C+程序。程序。iomanip 在使用在使用格式化格式化I/O时应包含此文件。时应包含此文件。2022-5-279 当用户在自己的程序中用当用户在自己的程序中用#include命令命令包含了上述有关的头文件就相当于在本程序包含了上述有关的头文件就相当于在本程序中声明了所需要的用到的类。中声明了所需要的用到的类。3

7、. 在在iostream头文件中定义的流对象头文件中定义的流对象2022-5-27104. 在在iostream头文件中重载运算符头文件中重载运算符在在iostream头文件中对头文件中对“”(原意是:原意是:左位移位运算符左位移位运算符和和右位移位运算符右位移位运算符)已经进行了已经进行了重载,使它们能用作标准类型数据的输入和输重载,使它们能用作标准类型数据的输入和输出。所以,在用它们的程序中必须用出。所以,在用它们的程序中必须用#include命令把命令把iostream包含到程序中:包含到程序中: #include 7.2 标准输出流标准输出流 标准输出流标准输出流是流向标准输出设备是流

8、向标准输出设备(显示显示器器)的数据。的数据。ostream类定义了类定义了3个输出流对个输出流对象,即象,即cout、cerr、clog。2022-5-27111. cout流对象流对象console output:在控制台在控制台(终端显示器终端显示器)的输出的输出2. cerr流对象流对象console error:在控制台在控制台(显示器显示器)显示出错信息显示出错信息3. clog流对象流对象console log:在终端显示器上显示出错信息。在终端显示器上显示出错信息。上面的上面的cerr和和 clog都是标准出错流,区别:都是标准出错流,区别:cerr是不经过缓冲区,直接向显示器

9、上输出有是不经过缓冲区,直接向显示器上输出有关错误信息关错误信息,而,而clog中的信息存放在缓冲区中的信息存放在缓冲区中,缓冲区满后或遇到中,缓冲区满后或遇到endl时向显示器输出。时向显示器输出。2022-5-27127.2.2 格式输出格式输出前面的所有程序在输出数据时,为简单起见,前面的所有程序在输出数据时,为简单起见,都没有指定输出的格式,由系统根据数据的类都没有指定输出的格式,由系统根据数据的类型采取默认的格式。如果要数据按指定的格式型采取默认的格式。如果要数据按指定的格式输出,可以采用:输出,可以采用: 使用格式控制符使用格式控制符; 使用流对象的有关成员函数使用流对象的有关成员

10、函数。1. 使用控制符控制输出格式使用控制符控制输出格式下表列出了输出数据的控制符。下表列出了输出数据的控制符。2022-5-27132022-5-2714注意:上表所示的控制符是在头文件iomanip中定义的,因而程序中要使用这些控制符时应当把此文件包含到程序中,即: #include 例例7.2 用控制符控制输出格式#include #include using namespace std;int main( ) int a; couta;couta;2022-5-2715 coutdec: coutdec:decdecaendl; aendl; /以以1010进制输出进制输出 couth

11、ex:couthex:hexhexaendl; aendl; /以以1616进制输出进制输出 coutoct: coutoct: setbase(8)setbase(8) aendl; aendl; /以以8 8进制输出进制输出 char char * *pt=China;pt=China; cout cout setw(10)setw(10) ptendl; ptendl; cout cout setfill(setfill(* *) ) setw(10)setw(10) ptendl; ptendl; double pi=22.0/7.0; double pi=22.0/7.0; cout

12、 cout setsetioios sflags(ios:scientific)flags(ios:scientific) setprecision(8) ;setprecision(8) ; coutpi=piendl; coutpi=piendl; coutpi= coutpi= setprecision(4)setprecision(4) piendl; piendl; coutpi= coutpi= setiosflags(ios:fixed)setiosflags(ios:fixed)piendl;piendl; return 0; return 0; 2022-5-27162. 用

13、流对象的成员函数控制输出格式通过流对象cout的成员函数成员函数来控制输出格式2022-5-27172022-5-2718例例 7.3 用流控制成员函数输出数据。#include using namespace std;int main( ) int a=21; cout.setf(ios:showbase); /设置输出时的基数符号设置输出时的基数符号 cout“dec:”aendl; /默认以默认以10进制输出进制输出 cout.unsetf(ios:dec); /终止终止10进制输出进制输出 cout.setf(ios:hex); /设置以设置以16进制输出进制输出 couthex:ae

14、ndl; cout.unsetf(ios:hex); /终止终止16进制输出进制输出2022-5-2719 cout.setf(ios:oct); /设置以设置以8进制输出进制输出 coutoct:aendl; char *pt=China; cout.width(10); /指定域宽为指定域宽为10 coutptendl; cout.width(10); /指定域宽为指定域宽为10 cout.fill(*); /指定空白处以指定空白处以*填填充充 coutptendl; double pi=22.0/7.0; cout.setf(ios:scientific); /指定科学记数法输出指定科学

15、记数法输出 coutpi=;2022-5-2720 cout.width(14); /指定域宽为指定域宽为14 coutpiendl; cout.unsetf(ios:scientific); /终止科学记数法终止科学记数法 cout.setf(ios:fixed); /指定用定点形式输出指定用定点形式输出 cout.width(12); /指定域宽为指定域宽为12 cout.setf(ios:showpos); /在输出时显示在输出时显示+号号 cout.setf(ios:internal); /数符出现在左侧数符出现在左侧 cout.precision(6); /保留保留6位小数位小数 c

16、outpi”从流中提取数据。流提取符“”从流中提取数据时通常跳过输入流中的空格、tab键、换行符等空白字符。 注意:只有在输入完数据再按回车键时,该行数据才被送入键盘缓冲区,形成输入流,提取运算符“”才能从中提取数据。 当输入流cin处于出错状态时,其值为false2022-5-2722即cin为0值;如果输入流在正常状态,cin的值为ture,即cin的值为一个非0值。例例 7.5 通过测试cin的值,判断流对象是否处于 正常状态。#include using namespace std;int main( ) float grade; coutgrade ) /如果能从如果能从cin流读取

17、数据流读取数据,cin为真,为真, /执行循环体执行循环体 if(grade=85) coutgrade GOOD!endl; if(grade60) coutgrade fail!endl; coutenter grade:; coutThe end.endl; return 0;2022-5-2724 说明:变量grade从输入流中提取实型数据时,提取操作成功,此时cin流处于正常状态;但在变量grade准备提取一个实型数据时,遇到了字母等其它字符,显然提取操作失败,故程序结束。7.3.2 用于字符输入的流成员函数用于字符输入的流成员函数(了解了解) 1. 用用get函数函数读入一个字符读

18、入一个字符P235 2. 用成员函数用成员函数getline函数函数读入一行字符读入一行字符 P2377.3.3 istream类的其他成员函数类的其他成员函数(了解了解) 1. eof 函数函数 P239 2. peek函数函数P239 3. putback函数函数 P239 4. ignore函数函数P2412022-5-27257.4文件操作与文件流文件操作与文件流 7.4.1 文件的概念文件的概念 前面讲座的输入输出是以系统指定的标前面讲座的输入输出是以系统指定的标准设备为对象的。在实际应用中,常以磁盘准设备为对象的。在实际应用中,常以磁盘文件为对象,即从磁盘读取数据,将数据写文件为对

19、象,即从磁盘读取数据,将数据写入到磁盘文件。入到磁盘文件。 所谓所谓“文件文件”,指指存储在外部介质上数存储在外部介质上数据的集合据的集合。对用户来说,常用到的文件分为对用户来说,常用到的文件分为两大类,一类是两大类,一类是程序文件程序文件;一类是;一类是数据文件数据文件。程序中的输入和输出的对象就是数据文件。程序中的输入和输出的对象就是数据文件。 根据文件中数据的组织形式,文件又可分根据文件中数据的组织形式,文件又可分为为ASCII文件文件和和二进制文件二进制文件。2022-5-2726 ASCII文件又称为文本文件文件又称为文本文件,它的每一个字它的每一个字节放一个节放一个ASCII代码,

20、代表一个字符。代码,代表一个字符。二进制文二进制文件件又称内部格式文件或字节文件又称内部格式文件或字节文件,是把内存中的是把内存中的数据按其在内存中的存储形式原样输出到磁盘上数据按其在内存中的存储形式原样输出到磁盘上存放存放。7.4.2 文件流类与文件流对象文件流类与文件流对象 文件流是以外存文件为输入输出对象的数据流。输出文件流输出文件流是从内存流向外存文件的数据;输入文件流输入文件流是从外存文件流向内存的数据。每一个文件流都有一个内存缓冲区与之对应。2022-5-2727 在C+的I/O类库中定义了几种文件类,专门用于对磁盘文件的输入输出操作。除了前面已经介绍过的标准输入输出流类istre

21、am,ostream和iostream类外,还有3个用于文件操作的文件类:(1)ifstream类,它是从istream类派生的,用来支持从磁盘文件的输入。(2)ofstream类,它是从ostream类派生的,用来支持向磁盘文件的输出。(3)fstream类,它是从iostream类派生的,用来支持对磁盘文件的输入输出。2022-5-2728 要以磁盘文件为对象进行输入输出,必要以磁盘文件为对象进行输入输出,必须定义一个文件流类的对象须定义一个文件流类的对象,通过文件流对象将数据从内存输出到磁盘文件,或者通过文件流对象从磁盘文件将数据输入到内存。 文件流对象是用文件流类定义的,而不是用ist

22、ream和ostream类来定义的。可以用下面的方法建立一个输出文件流对象: ofstream outfile; 也可以建立一个输入文件流对象: ifstream infile; 2022-5-2729 虽然上面定义了一个输入或输出流文件对象,但还未指定它向哪一个磁盘文件输入或输出。7.4.3 文件的打开与关闭文件的打开与关闭 1. 打开磁盘文件打开磁盘文件 打开文件是指在文件读写之前做必要的准打开文件是指在文件读写之前做必要的准备工作,包括:备工作,包括: (1)为为文件流对象和指定的磁盘文件建立关文件流对象和指定的磁盘文件建立关联联,以便合文件流流向指定的磁盘文件。,以便合文件流流向指定的

23、磁盘文件。 (2)指定文件的工作方式指定文件的工作方式,如:该文件是输,如:该文件是输入文件还是输出文件,是入文件还是输出文件,是ASCII文件还是二进制文件还是二进制文件等文件等2022-5-2730方法一方法一:调用文件流的成员函数调用文件流的成员函数open,如: ofstream outfile; /定义定义ofstream类类(输出文件流类输出文件流类)对象对象outfile outfile.open( “a1.dat” , ios:out ); /使文件流与使文件流与a1.dat文件建立关联调用成员函数open的一般形式为:文件流对象.open(磁盘文件名,输入输出方式); 其中,

24、磁盘文件名可以包括路径,如缺省路径,则默认为当前目录下的文件。2022-5-2731方法二:在定义文件流对象时指定参数。方法二:在定义文件流对象时指定参数。 在声明文件流类时定义了带参数的构造在声明文件流类时定义了带参数的构造函数,其中包含了打开磁盘文件的功能,因函数,其中包含了打开磁盘文件的功能,因此,可以在定义文件流对象时指定参数,调此,可以在定义文件流对象时指定参数,调用文件流类的构造函数来实现打开文件的功用文件流类的构造函数来实现打开文件的功能。能。如:如: ostream outfile ( “a1.dat” , ios:out ); 一般多用此方法,因为比较方便,其作用一般多用此方

25、法,因为比较方便,其作用与与open函数相同。函数相同。 上面两种方法中的输入输出方式见下表所上面两种方法中的输入输出方式见下表所示示:2022-5-27322022-5-2733说明:(1)每一个打开的文件都有一个文件指针,该指针的初始位置由I/O方式指定,每次读写都从每次读写都从文件指针的当前位置开始文件指针的当前位置开始。当文件指针移到最后,就会遇到文件结束文件结束EOF(文件结束符也占一个字节,其值为其值为-1),此时流对象的成员时流对象的成员函数函数eof的值为非的值为非0值值(一般认为一般认为1),表示文件结束了。(2)如果打开操作失败,open函数的返回值为函数的返回值为0(假假

26、),如果是用调用构造函数的方式打开文件,则流对象的值为流对象的值为0。可以据此测试打开是否成功。如:2022-5-2734 if( outfile.open ( “a1.dat” , ios:app )=0 cout“open.error”;或 if( !outfile.open ( “a1.dat” , ios:app ) cout“open.error”;2. 关闭磁盘文件关闭磁盘文件 在对已打开的磁盘文件的读写操作完成在对已打开的磁盘文件的读写操作完成后,应关闭该文件。关闭文件用成员函数后,应关闭该文件。关闭文件用成员函数close。如:。如: outfile.close( ); /将输

27、出文件流所关联的磁盘文件关闭将输出文件流所关联的磁盘文件关闭2022-5-27357.4.4 对对ASCII文件的操作文件的操作 对ASCII文件的读写操作可以用以下两种文件的读写操作可以用以下两种方法:方法:(1)用流插入运算符用流插入运算符“”输入输出标准类型的数据输入输出标准类型的数据。 对磁盘文件的操作,可以通过文件流对象和对磁盘文件的操作,可以通过文件流对象和流插入运算符流插入运算符“”实现实现对磁盘的读写,如同用对磁盘的读写,如同用cin,cout和和对标准对标准设备进行读写一样。设备进行读写一样。(2)用文件流的用文件流的put,get,getline等成员函数进行字等成员函数进

28、行字符的输入输出。符的输入输出。2022-5-2736例例7.11 写入磁盘文件#include #include using namespace std;int main( ) int a10; ofstream outfile(f1.dat“ , ios:out); /定义文件流对象,打开磁盘文件定义文件流对象,打开磁盘文件f1.dat if( !outfile ) /如果打开失败,如果打开失败, outfile返回返回0值值 cerropen error!endl; exit(1); 2022-5-2737 coutenter 10 integer numbers:endl; for(

29、int i=0 ; ia i ; outfile a i “ ”; /向磁盘文件向磁盘文件f1.dat输出数据输出数据 outfile.close( ) ; /关闭磁盘文件关闭磁盘文件f1.dat return 0;说明:说明:(1)在在VC中调试时必须包含头文件:中调试时必须包含头文件:fstream。2022-5-2738(2) ofstream outfile(“f1.dat“ , ios:out);语句语句中的参数中的参数ios:out可以省略,这是默认形式。可以省略,这是默认形式。即下面两种写法等价:即下面两种写法等价: ofstream outfile(f1.dat“ , ios:

30、out); ofstream outfile(f1.dat“ );(3)如果如果打开成功,则文件流对象打开成功,则文件流对象outfile的返回的返回值为非值为非0值值;如果;如果打开失败,则返回值为打开失败,则返回值为0(假假)(4)函数函数exit(1)为系统函数,表示结束运行为系统函数,表示结束运行。其。其中的参数为任意整数,可用中的参数为任意整数,可用0,1或其他整数或其他整数(5) outfilea i “ ”; 就是把标准输出流对就是把标准输出流对象象cout换成文件输出流对象换成文件输出流对象outfile而已。而已。2022-5-2739例例7.12 读出例读出例7.11的磁盘

31、文件并找出最大数的磁盘文件并找出最大数#include #include using namespace std;int main( ) int a10 , max , i , order ; ifstream infile( f1.dat , ios:in ); 2022-5-2740if( !infile ) cerropen error!endl; exit(1); for(i=0;iai; coutai ; coutendl; max= a0; order= 0;2022-5-2741 for( i=1 ; i max ) max = a i ; order = i; coutmax=

32、maxendlorder=“ orderendl; infile.close( ); return 0;2022-5-27427.4.5 对二进制文件的操作对二进制文件的操作 二进制文件不是以二进制文件不是以ASCII代码存放数据代码存放数据的,它将的,它将内存中数据存储形式不加转换地内存中数据存储形式不加转换地传送到磁盘文件传送到磁盘文件,因此它又称为内存数据,因此它又称为内存数据的映像文件。的映像文件。 对二进制文件的操作在使用时需要先打对二进制文件的操作在使用时需要先打开文件,用完后要关闭二进制文件。在打开文件,用完后要关闭二进制文件。在打开时要用开时要用ios:binary指定为以二进

33、制形式指定为以二进制形式传送和存储。传送和存储。二进制文件除了可以作为输二进制文件除了可以作为输入文件或输出文件外,还可以是既能输入入文件或输出文件外,还可以是既能输入又能输出的文件又能输出的文件,这是和,这是和ASCII文件不同的文件不同的地方。地方。2022-5-27431. 用成员函数用成员函数read和和write读写二进制文件读写二进制文件 对二进制文件的读写主要是用对二进制文件的读写主要是用istream类的类的成员函数成员函数read和和write来实现。这两个成员函来实现。这两个成员函数的原型为:数的原型为: istream& read( char *buffer ,

34、int len); ostream& write( const char * buffer , int len ); 其中字符指针其中字符指针buffer指向内存中的一段存储指向内存中的一段存储空间,空间,len是读写的字节数。调用的方式为:是读写的字节数。调用的方式为: a.write( p1 , 50 ); b.read( p2 , 30 );式中的式中的a是输出文件流对象是输出文件流对象,write函数将字符指针函数将字符指针2022-5-2744 p1所给出的地址开始的所给出的地址开始的50个字节的内容不加个字节的内容不加转换地写到磁盘文件中。转换地写到磁盘文件中。b是输入流对

35、象是输入流对象,read函数从函数从b所关联的磁盘文件中,读入所关联的磁盘文件中,读入30个字节,存放在字符指针个字节,存放在字符指针p2所指的一段空间所指的一段空间内。内。例例7.14 将数据以二进制形式存放在磁盘文件中将数据以二进制形式存放在磁盘文件中 #include #include using namespace std;2022-5-2745struct student char name20; int num; int age; char sex; ;int main( ) student stud 3 = Li , 1001 , 18 ,f, Fun, 1002 , 19 ,m, Wang, 1004 , 17 ,f ; ofstream outfile( stud.dat , ios:binary ); 2022-5-2746if( !outfile ) cerr open error! endl; abort( ); /退出程序退出程序 for( int i=0 ; i3 ; i+ ) outfile.write( (char *) & stud i , sizeof( stud i ) );outf

温馨提示

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

评论

0/150

提交评论