第11章C++输入输出流ppt课件.ppt

上传人:牧羊曲112 文档编号:1353940 上传时间:2022-11-13 格式:PPT 页数:49 大小:241.50KB
返回 下载 相关 举报
第11章C++输入输出流ppt课件.ppt_第1页
第1页 / 共49页
第11章C++输入输出流ppt课件.ppt_第2页
第2页 / 共49页
第11章C++输入输出流ppt课件.ppt_第3页
第3页 / 共49页
第11章C++输入输出流ppt课件.ppt_第4页
第4页 / 共49页
第11章C++输入输出流ppt课件.ppt_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《第11章C++输入输出流ppt课件.ppt》由会员分享,可在线阅读,更多相关《第11章C++输入输出流ppt课件.ppt(49页珍藏版)》请在三一办公上搜索。

1、C+语言程序设计,第11章 输入/输出流,11.1 输入/输出流概述11.2 插入运算符及提取运算符11.3 格式化输入输出11.4 文件的输入输出11.5 输入输出文件流fstream,11.1 输入/输出流概述,11.1.1 流的概念 “流”是一种抽象的形态,指的是计算机里的数据从一个对象流向另一个对象。这里数据流入和流出的对象通常是指计算机中的屏幕、内存、文件等一些输入输出设备。数据的流动就是由I/O流类来实现的。 如预定义流对象cin和cout实现的数据流动过程: C+中的I/O流负责建立程序与设备对象之间的连接,它像一个桥梁,沟通了数据的产生者和消费者,使他们之间产生数据的流动 。,

2、11.1 输入/输出流概述,11.1.2 流类库的结构,I/O流类说明表,I/O流类说明表(续),11.1 输入/输出流概述,11.1.2 流类库的结构(续) 流类库中与文件输入输出相关的文件流类结构:,11.2 插入运算符与提取运算符,1. 插入运算符 插入运算符“”:通常用于插入数据到一个输出流对象中,流对象再进一步将数据输出到它所关联的设备中。 如:cout “Hello World!” 插入运算符“”适用于任何输出流对象,如输出文件流ofstream的对象等。“”右侧可以是任何标准数据类型的变量及常量,也可以是字符串变量及常量。 如:cout i s 3.14 f ;,11.2 插入运

3、算符与提取运算符,2. 提取运算符 提取运算符“”:通常用于从输入流对象中提取数据。 如: int i; char buf100; cin i ; cin buf ; 提取运算符“”适用于任何输入流对象,如输入文件流ifstream的对象等。“”右侧可以是任意标准数据类型的变量,也可以是字符串变量。 注意:使用提取运算符“”提取数据时,以空白符(如空格、回车、tab)作为数据的分割符,因此提取字符串数据时,不能提取空白字符。,11.3 格式化输入输出,C+中的I/O流可以完成输出/输入的格式化操作,如设置域宽、设置精度及整数进制等。设置输入输出格式的方法: 使用流操纵元,只需把流操纵元插入(提

4、取)到输出流(输入流)中即可对输出流(输入流)进行格式化,如setiosflags、setw、setfill、setprecision、hex、oct等,使用流操纵元时需在程序中包含头文件iomanip.h 通过流的成员函数,即由流对象直接调用完成格式化,如setf、unsetf、width、fill、precision等。使用流成员函数的优点是在设置格式同时,可以返回以前的设置,便于恢复原来的设置。,11.3 格式化输入输出,11.3.1 输出宽度控制:setw和width 使用流操纵元setw和成员函数width可以控制当前域宽(即输入/输出的字符数)。 注意: (1) 宽度的设置仅适用于

5、下一个插入或读取的数据。 (2) 在输出流中控制域宽,如果输出数据的宽度比设置的域宽小,将以默认右对齐方式输出数据,左边空位会用填充字符来填充(填充字符默认是空格)。 (3) 如果输出数据的宽度比设置的宽度大,数据不会被截断,将输出所有位数。,例11.1 使用setw操纵元控制域宽,# include # include void main( )cout 123 endl;cout setw(5) 4.5 6.7 endl;,程序运行结果为:123 4.56.7,例11.2 使用width成员函数控制域宽,# include void main( )char * str3 = “abc”, “

6、abcde”, “abcdef”;for (int i = 0; i 3; i + ) cout.width(5); cout stri endl;,程序运行结果为: abcabcdeabcdef,11.3 格式化输入输出,11.3.2 填充字符控制:setfill和fill 在缺省情况下,如果域宽大于数据宽度时,填充多余空间的字符是空格。如果要改变填充字符,可以使用流操纵元setfill和成员函数fill。 注意:设置了填充字符后,将对程序后面的输出代码产生永久影响,直到下一次再改变填充字符为止。,例11.3 使用setfill控制填充字符,# include # include void

7、main( )double values = 1.23, 15.16, 653.7, 4358.24;cout setfill(*) ;for ( int i = 0 ; i 4 ; i + )cout setw(10) valuesi endl;,程序运行结果为:*1.23*15.16*653.7*4358.24,11.3 格式化输入输出,11.3.3 输出精度控制:setprecision和precision 使用流操纵元setprecision以及成员函数precision可以控制浮点数输出的精度。 注意:精度一旦设置,就可以用于以后所有输出的数据,直到下次精度发生改变。 使用成员函数p

8、recision可以返回设置前的精度。,例11.4 控制浮点数精度,# include # include void main( )double value = 31.4142743;int Preprecision = cout.precision(4);cout value endl;cout setprecision( Preprecision ) value endl;,程序运行结果为:31.4131.4143,11.3 格式化输入输出,11.3.3 输出精度控制 所设置的精度值,在程序没有设置计数法情况下,表示浮点数的有效数字的个数。若程序设置了计数法(ios:fixed或ios:s

9、cientific),则表示小数点后数字的个数。 ios:fixed 表示以定点法输出浮点数(不带指数)。 ios:scientific 表示以科学计数法输出浮点数。,例11.4 控制浮点数精度(加入设置计数法),# include # include void main( )double value = 31.4142743; cout setiosflags( ios:fixed );int Preprecision = cout.precision(4);cout value endl;cout setprecision( Preprecision ) value endl;,程序运行结

10、果为:31.414331.414274,例11.4 (续),# include # include void main( )double value = 31.4142743; cout setiosflags( ios:scientific );int Preprecision = cout.precision(4);cout value endl;cout setprecision( Preprecision ) value endl;,程序运行结果为:3.1414e+0013.141427e+001,11.3 格式化输入输出,11.3.4 其他格式状态 上例中的setiosflags也是

11、一个流操纵元,定义在头文件中。 通过将setiosflags的参数设置为各种不同流格式状态标志值,可以对相应的输入输出格式进行控制。 若需要同时设置多个标志位时,可以使用按位或运算符(|)将不同的标志项结合。,I/O流格式状态标志,例11.5 使用setiosflags控制流格式,# include # include void main( )int x = 200;cout setiosflags(ios : internal | ios : showpos );cout setw(10) x endl;cout setiosflags(ios : hex| ios : uppercase

12、| ios : showbase) ; cout setw(10) x endl;cout oct setw(10) x endl;,程序运行结果为:+ 2000X C80 310,11.3 格式化输入输出,11.3.4 其他格式状态(续) 使用流操纵元setiosflags设置相应的标志位后,对流对象产生的影响是持久的,若想恢复以前的默认设置,可以通过resetiosflags流操纵元关闭相应的标志位。 如: cout resetiosflags( ios : internal | ios : showbase); 可以取消对域中对齐格式的设置,同时取消显示数制标志,恢复系统默认格式。,11

13、.4 文件的输入输出,处理文件输入输出的流类主要有ofstream、ifstream和fstream三个类。均定义在fstream.h中。 向文件输出数据即将数据保存到文件中时,要使用ofstream类;从文件中读取数据即从文件中输入数据时,要使用ifstream类。而使用fstream类可以同时进行输入及输出操作。 文件输入输出的一般步骤为: 创建流对象并打开文件 读写文件 关闭文件,11.4 文件的输入输出,11.4.1 打开文件 1. 使用默认构造函数,然后调用open函数 用法如下: 文件I/O流类名 流对象名; /声明一个流对象 流对象名.open(文件名,打开方式); /调用ope

14、n函数打开文件 如: ofstream my_file; my_file.open(“boot.ini”, ios:out); 参数“文件名”:用于指定要打开文件的文件名 若为不带路径的文件名表示与当前应用程序在同一文件夹 若带路径的文件名,注意 应用 表示,11.4 文件的输入输出,11.4.1 打开文件(续一) 参数“打开方式”:用于指定文件的打开方式,11.4 文件的输入输出,11.4.1 打开文件(续二) 2. 在构造函数中直接指定文件名及打开方式 用法如下: 文件I/O流类名 流对象名(文件名,打开方式); 如: ifstream infile ( “D:hello.dat”, io

15、s:binary );,如果使用以上两种方法打开文件不成功(如文件路径不正确),文件流对象将为0,因此习惯上可用如下方式判断打开操作是否失败: if(! my_file) /如果打开文件的操作不成功,11.4 文件的输入输出,11.4.2 写入文件 如果写入的是标准数据类型的数据或字符串,可以直接通过插入运算符(),将数据插入到输出文件流对象中。如: ofstream my_file ( “D:data.txt” , ios:out ); my_file “Hello!” 234 endl; 使用插入运算符在写入数据时仅局限于标准数据类型及字符串,对于自定义类型的数据并不能直接插入。,空格,是

16、为了在文件中将数据分隔开,以便在读出时能正确区分数据。,11.4 文件的输入输出,11.4.2 写入文件(续一) 1. put函数: 使用put函数可以将一个单个字符写入流对象,进而写入流对象所关联的文件中。put函数每次只能写一个字符。 用法如下: my_file.put(A); char ch = A; my_file.put(ch); 注意:使用put函数输出数据不受格式影响,即设置的域宽和填充字符对于put函数不起作用。,11.4 文件的输入输出,11.4.2 写入文件(续二) 2. write函数:把内存中的一块内容写入输出流对象中。主要用于输出数组及自定义类型变量等具有连续内存的数

17、据。 write函数的第一个形参: 用于指定输出数据的内存起始地址,该地址为字符型(char *),因此传递的实参应为字符型的指针。 write函数的第二个形参: 用于指定所写入的字节数,即从该起始地址开始写入多少字节的数据,第二个形参类型为整型。,例11.6 使用write函数输出CRect类的对象,# include void main()CRect r; r.SetLocation(10,20);r.SetSize(100,200);ofstream outfile (“D:a.txt”, ios:out); outfile.write( (char *) /调用close函数关闭文件,

18、定义输出文件流对象并打开文件进行输出,将r地址强制类型转换(char *)为字符型指针,例11.7 使用write函数输出整型数组,# include void main()int array = 35, 42, 57, 88, 69, 75;ofstream outfile2(“D:a.txt”, ios:app); outfile2.write( (char *) array , sizeof(array) ); outfile2.close(); ,在打开的文件尾添加数据,将数组首地址强制类型转换,若将主函数的array数组改为:char array = “hello world!”;则

19、write语句将变为:outfile2.write( array, sizeof (array) );,无须强制类型转换,11.4 文件的输入输出,11.4.3 读取文件 如果读取的是标准数据类型的数据或字符串,可以直接通过提取运算符(),将数据从输入文件流对象读取到程序的变量中。 使用提取运算符提取数据时,将以空白字符(如空格、Tab、回车)作为数据之间的分隔符,因此这些空白字符不能被作为数据提取出来。如: char s10; int i; ifstream in_file ( “D:data.txt” , ios:in ); in_file s i;,若文件中数据为:Hello! 234则

20、s和i的数据分别为:“Hello!”、234,11.4 文件的输入输出,11.4.3 读取文件(续一) 1. get函数: 使用get函数可以从流对象中提取一个单个字符,get函数弥补了提取运算符不能提取空白字符的缺点,它能把任意字符包括空白符提取出来。 get函数提取一个字符时,有带形参和不带形参两种形式: 如: char ch ; ch = cin.get(); 或: cin.get(ch); 若以上语句中调用get函数的是一个输入文件流对象,则将从该流对象所关联的文件中提取出单个字符。,11.4 文件的输入输出,11.4.3 读取文件(续二) 2. getline函数:用于从流对象中提取

21、多个字符,通常用于提取一行字符。get函数有三个形参。 getline函数的第一个形参: 为字符型指针(char *),用于存放读出的多个字符,通常传递的实参为字符数组。 getline函数的第二个形参: 为整型,用于指定本次读取的最大字符个数。 getline函数的第三个形参: 为字符型,默认值为回车符(n),用于指定分隔字符,作为一次读取结束的标志。,例11.8 读取文件E:boot.txt中的内容,并输出到屏幕上,# include # include void main()char array100;ifstream ifs( “E:boot.txt”, ios:nocreate );

22、if(!ifs)return; /如果文件不存在,打开不成功,则结束程序while ( !ifs.eof() ) /eof函数用于判断是否到文件尾,到文件尾返回Trueifs.getline(array, 100); /100表示每次读取字符的个数最多为99个cout array endl;ifs.close(); ,使用getline函数按行读取文件中的数据,每次读取一行时,遇回车符或达到最大字符个数,则结束,并将读出数据保存于数组array中。,11.4 文件的输入输出,11.4.3 读取文件(续三) 3. read函数:从流对象中提取整块数据到变量中,主要用于提取数据到数组及自定义类型变

23、量中。 read函数的第一个形参: 用于保存读出的数据,类型为字符型指针(char *),与write函数中用法一致。 read函数的第二个形参: 用于指定读出多少个字节,类型为整型。与write函数中用法一致。,例11.9 读取例10.6中输出到文件“D:a.txt”中的内容,并将矩形参数显示到屏幕上,# include # include void main()CRect r2; ifstream ifile (“D:a.txt”); ifile.read( (char *) ,程序运行结果为:矩形左上角坐标为(10,20)矩形长和宽分别为100,200,11.4 文件的输入输出,11.4

24、.4 文件读写位置指针 位置指针:用于保存在文件中进行读或写的位置。通过对位置指针的操作,适当地调整读或写的位置,可以实现对磁盘文件的随机访问。 与ofstream对应的是写位置指针,指定下一次写数据的位置。相关的操作函数为: seekp函数:用于移动指针到指定位置。 tellp函数:用于返回指针当前的位置。 与ifstream对应的是读位置指针,指定下一次读数据的位置。相关的操作函数为: seekg函数:用于移动指针到指定位置。 tellg函数:用于返回指针当前的位置。,11.4 文件的输入输出,11.4.4 文件读写位置指针(续) seekg函数的使用形式(seekp类似): seekg(

25、n):用于移动指针到文件第n个字节后。 seekg(n,ios:beg):从文件起始位置向后移动n个字节。 seekg(n,ios:end):从文件结尾位置向前移动n个字节。 seekg(n,ios:cur): 从当前位置向前或向后移动n个字节。 其中:n=0,在指定位置; n0,在指定位置向后移动; n0,在指定位置向前移动。 tellg函数的使用形式(tellp类似): streampos n = 流对象.tellg() streampos可看作整型数据,返回值保存指针当前的位置。,例11.10 已知文件data.txt中存有10个CRect对象的数据,现要求读取最后一个对象,把它的左上角

26、坐标修改为(100,100),其他不变,修改后写回到文件中去。,#include void main()CRect rt;ifstream ifs( “data.txt” );ifs.seekg( 0, ios:end ); /将指针移动到文件尾streampos lof = ifs.tellg(); /求得文件长度lofifs.seekg( -lof/10, ios:end ); /将指针移动到最后一条记录起始位置ifs.read( (char *),11.4 文件的输入输出,11.4.5 错误处理函数 eof() 如果输入流结束,到文件尾,则返回True; bad() 如果出现一个严重的、

27、不可恢复的错误,如由于非法操作导致数据丢失、对象状态不可用等,则返回True,通常这种错误不可修复,此时不要对流再进行I/O操作; fail() 如果某种操作失败,如打开操作不成功,或不能读出数据,或读出数据的类型不符等等,则返回True; good() 如果以上三种错误均未发生,表示流对象状态正常,则返回True。以上函数可由流对象直接调用,如: if(!inf.eof() /如果没有到文件末尾,if条件满足,11.4 文件的输入输出,11.4.6 关闭文件 文件使用完毕后必须将其关闭才能断开流和对象之间的联系。文件关闭后,还可以再次与流对象关联,打开文件进行输入或输出操作。 使用流对象的c

28、lose函数可以完成关闭文件的操作, close函数无形参,调用形式为: 流对象.close();,11.5 输入输出文件流fstream,fstream类:对文件同时进行读写,它将输入和输出流的功能集于一身。 使用fstream打开文件的方法: fstream iofile( “myfile.dat” , ios:in | ios:out ); 注意:必须指定打开方式,因为没有默认值。 在使用fstream的对象读写文件时,可以联合使用seekg和seekp函数对指针进行定位,调整正确的读写位置。,例11.11 打开文件“E:myfile.txt”进行读写,首先读出文件内容,显示出来,再将内

29、容写入原文件结尾,并将写入后的文件内容显示出来。,# include# includevoid main()fstream iofile( “E:myfile.txt”, ios:in | ios:app ); iofile.seekg( 0, ios:end ); /定位至文件尾streampos lof= iofile.tellg(); /获取文件长度char *data;data = new charlof; /动态分配内存用于保存文件内容iofile.seekg( 0, ios:beg ); /定位至文件头iofile.read( data, lof ); /将文件内容读到data指向

30、的内存中cout “原文件内容为:” endl;,例11.11 (续),for( int i =0; ilof; i+ )cout datai; /逐个输出data指向内存中的字符cout endl;iofile.write( data, lof ); /打开方式为ios:app,能将读出内容写入文件尾delete data;iofile.seekg( 0, ios:end ); lof = iofile.tellg();data = new charlof;iofile.seekg( 0, ios:beg );iofile.read( data, lof );cout “读写操作后文件内容为

31、:” endl;for(i =0; ilof; i+ )cout datai;cout endl;iofile.close();delete data;,程序运行结果为:原文件内容为:abcdefghi读写操作后文件内容为:abcdefghiabcdefghi,小结,C+提供I/O流类库进行各种输入和输出。ios类是所有输入/输出流类的基类,从ios类派生出输入流类istream和输出流类ostream。ostrstream类和ofstream类是ostream类的两个常用派生类,ostrstream类支持字符数组的输出,ofstream类专门用于磁盘文件的输出。,作业,章后习题2,3,4,6,7,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号