第 输入输出流PPT课件_第1页
第 输入输出流PPT课件_第2页
第 输入输出流PPT课件_第3页
第 输入输出流PPT课件_第4页
第 输入输出流PPT课件_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

1、14.1 输入输出基本概念输入输出基本概念14.1.1输入输出流输入输出流(Stream)流流 - 数据在程序和设备之间数据在程序和设备之间“流动流动”逻辑逻辑设备设备内部内部程序程序数据数据输入流输入流输出流输出流数据数据逻辑逻辑设备设备文本流文本流 - 一串一串 ASCII 字符。字符。二进制流二进制流 - 按二进制格式存放的数据(内存映象)。按二进制格式存放的数据(内存映象)。14.1.2 文本流、二进制流和数据文件文本流、二进制流和数据文件第1页/共65页数值数值 12345 在在 文本流文本流中和中和二进制流二进制流中的形式:中的形式:00110001 00110010 001100

2、1100110100 00110101 1 2 3 4 5 ASCII 形式:形式:(文本流文本流 , 字符串字符串)区别:区别:在内存中在内存中int 型数据的形式型数据的形式:00110000 0011100100000000 00000000在二进制流中的形式:在二进制流中的形式:00110000 0011100100000000 00000000在在“流流”中的中的数据是以字节数据是以字节为单位的。为单位的。第2页/共65页整数整数 12345 若存于文本文件中,占若存于文本文件中,占 5 个字节,个字节, 即存放即存放 5 个个 ASCII 字符(看成字符串)字符(看成字符串) 若存

3、于二进制文件中,占若存于二进制文件中,占 4 个字节,内存映象个字节,内存映象 因为一个整数在内存中占因为一个整数在内存中占 4 个字节个字节一个一个逻辑设备逻辑设备对应一个对应一个文件文件,“文件文件”指指:(1) 磁盘文件磁盘文件(2) 设备文件设备文件(如键盘、显示器、打印机等如键盘、显示器、打印机等)数据文件数据文件用于存放信息:用于存放信息: 存放存放ASCII字符的文件称为字符的文件称为文本文件。文本文件。 存放二进制数据的文件称为存放二进制数据的文件称为二进制文件。二进制文件。第3页/共65页14.1.3 缓冲缓冲逻辑逻辑设备设备内部内部程序程序数据数据输入流输入流输出流输出流数

4、据数据逻辑逻辑设备设备内存缓冲区内存缓冲区内存缓冲区内存缓冲区引入缓冲的目的引入缓冲的目的是解决是解决CPU的运行速度和外设操作速度的运行速度和外设操作速度不匹配的矛盾。如输出时先写入缓冲区,再成批输出。不匹配的矛盾。如输出时先写入缓冲区,再成批输出。成批写出数据比一个一个写出数据节约时间。成批写出数据比一个一个写出数据节约时间。第4页/共65页14.2 输入输出流类体系输入输出流类体系14.2.1 基本输入输出流类体系基本输入输出流类体系C+预预定义了流类,用于完成数据的定义了流类,用于完成数据的“流动流动”(输入输出输入输出)iosistreamiostreamostreamstreamb

5、ufistream_withassignostream_withassign流基类通用输入流基类通用输出流基类通用输入输出流类基类cin所属的输入流类cout、cerr、clog所属的输出流类抽象缓冲区基类在这些已定义的类中,给出了若干方法(成员函数),用于控制输入输出。第5页/共65页使用上述流类,必须包含头文件使用上述流类,必须包含头文件 “ iostream.h”14.2.2 用运算符重载实现标准设备的输入输出用运算符重载实现标准设备的输入输出观察头文件观察头文件istream.h :class istream : virtual public ios public:istream&am

6、p; operator(char *); /A 字符串字符串输入重载函数输入重载函数istream& operator(char &); /B 字符字符输入重载函数输入重载函数istream& operator(int &); /C 整数整数输入重载函数输入重载函数istream& operator(double &); /D 实型实型数据输入重载函数数据输入重载函数;C+ 对基本的数据类型,均定义了重载运算符对基本的数据类型,均定义了重载运算符 将将右移右移位运算符位运算符 重载为重载为 提取提取 运算符运算符第6页/共65页class ist

7、ream_withassign : public istream ;extern istream_withassign cin;cin 是是 istream_withassign 类对象,继承了重载运算符类对象,继承了重载运算符。编译器会将编译器会将 cinxy; 解释成解释成 (cin.operator(x) .operator(y); 返回返回 cin第7页/共65页同理:同理:C+还定义了三个还定义了三个输出流对象输出流对象 cout、cerr 和和 clog。这三个对象均是这三个对象均是ostream_withassign类的对象,类的对象,它们均在头文件它们均在头文件ostream.

8、h中被定义中被定义 cin 标准输入流标准输入流(输入设备是键盘输入设备是键盘) cout 标准输出流标准输出流(输出设备是显示器输出设备是显示器) cerr 标准错误输出流,没有缓冲,立刻输出。标准错误输出流,没有缓冲,立刻输出。 clog 输出日志信息,有缓冲,缓冲区满后被输出。输出日志信息,有缓冲,缓冲区满后被输出。同理在同理在ostream类中类中重载了重载了 运算符运算符编译器会将编译器会将 coutxy; 解释成解释成 (cout.operator(x) .operator(y); 返回返回 cout第8页/共65页例例14.2 使用使用cout、cerr和和clog #inclu

9、de #include void main( ) double x; coutx; if(x0) cerrx is not a positive number!n; /B return; clogThe root of x is sqrt(x)endl; /C 在本例中,cout、cerr和clog的作用相同。而cerr和clog的区别在于,cerr是非缓冲输出,而clog是缓冲输出。请看例14.3:第9页/共65页例例14.3 体会体会cerr和和clog的区别的区别 #include void main( )double x;clogx;coutxendl; /B此程序在屏幕上的运行过程如

10、下:此程序在屏幕上的运行过程如下:5 /输入输入 5 /B行的输出行的输出 Please input x: /A行的输出行的输出 原因:clog是缓冲输出,当缓冲区满或程序结束时, 才“真正”输出到屏幕上。第10页/共65页14.2.3 缺省的输入输出格式缺省的输入输出格式1缺省的(默认的)输入格式缺省的(默认的)输入格式 cin 是缓冲流,当输入一行结束按回车(是缓冲流,当输入一行结束按回车(Enter)时,)时, 操作系统将输入内容放入输入缓冲区,操作系统将输入内容放入输入缓冲区, 然后然后 cin 从输入缓冲区提取数据。从输入缓冲区提取数据。输入数据时,在缺省的情况下,数据之间的分隔符为

11、:输入数据时,在缺省的情况下,数据之间的分隔符为:键(空格键)、键(空格键)、键(制表键)或键(制表键)或键(回车键),这三个键通称为空白字符。键(回车键),这三个键通称为空白字符。 输入数据的类型必须与提取数据的变量类型一致。输入数据的类型必须与提取数据的变量类型一致。第11页/共65页如:如:char c1, c2, c3; cinc1c2c3;程序运行时,可输入:程序运行时,可输入:abc 也可输入:也可输入:ab c 或输入:或输入:a b c 在上述情况下,在上述情况下,三个变量三个变量c1、c2和和c3获得值均为获得值均为 a、b 和和 c。应注意,最后输入的总是回车键。应注意,最

12、后输入的总是回车键。 第12页/共65页又如:又如:char s120, s220; cins1s2; 输入输入abcd 或输入或输入abcd 或输入或输入abcd结果字符串结果字符串s1和和s2提取的值均分别为提取的值均分别为ab和和cd。 回车回车 起两个作用:起两个作用: 表示一行结束,可进行提取操作了。表示一行结束,可进行提取操作了。 可用它做数据分隔符。可用它做数据分隔符。第13页/共65页不同类型数据的输出有其缺省的不同类型数据的输出有其缺省的(默认的默认的)输出格式:输出格式:输出整型数:十进制、域宽为输出整型数:十进制、域宽为0、右对齐、空格填充。、右对齐、空格填充。输出实型数

13、:精度输出实型数:精度6位、浮点输出、位、浮点输出、 域宽为域宽为0、右对齐、空格填充。、右对齐、空格填充。 若整数部分超过若整数部分超过7 位或有效数字在小数点后第位或有效数字在小数点后第4 位之后,位之后, 自动转为科学计数法格式输出。自动转为科学计数法格式输出。若数的实际宽度超过域宽,则按实际长度输出。输出字符或字符串:域宽为输出字符或字符串:域宽为0、右对齐、空格填充。、右对齐、空格填充。 14.2.3 缺省的输入输出格式缺省的输入输出格式2缺省的(默认的)输出格式缺省的(默认的)输出格式 第14页/共65页例例14.4 标准输出的默认输出格式标准输出的默认输出格式#include #

14、include void main( )double d1=12.3456789, d2=123456.789, d3=0.0000123456;coutd1,d2,d3endl;coutsetw(10)d1,setw(10)d2, setw(10)d3endl;char s10=abcd, c=k;couts,setw(4)cendl;输出结果:输出结果:12.3457, 123457, 1.23456e-00512.3457, 123457, 1.23456e-005abcd, k 注意注意:表示空格表示空格第15页/共65页缺省的输入输出格式都可以改变:具体方法有两种缺省的输入输出格式都

15、可以改变:具体方法有两种。14.3.1 使用成员函数进行格式控制使用成员函数进行格式控制 在在 ios 类中,定义了一个类中,定义了一个公有的公有的无名枚举成员,无名枚举成员,用于进行输入输出格式控制。用于进行输入输出格式控制。完整内容见完整内容见 “第第14章章 输入输出流输入输出流(例子例子).doc”或教材。或教材。enum / 部分内容如下,含义见表部分内容如下,含义见表141。 skipws=0 x0001, /跳过输入中的空白字符跳过输入中的空白字符 I . dec=0 x0010, /将数据转换成十进制数将数据转换成十进制数 I/O oct=0 x0020, /将数据转换成八进制

16、数将数据转换成八进制数 I/O hex=0 x0040, /将数据转换成十六进制数将数据转换成十六进制数 I/O showbase=0 x0080, /输出时带有一个表示数制的字符输出时带有一个表示数制的字符 O .;14.3 输入输出格式控制 访问这些枚举常量:访问这些枚举常量:ios:skipwsios:dec、 ios:oct 、 ios:hexios:showbase 等等等等第16页/共65页在ios.h中的定义形式:static const long basefield; / dec | oct | hexstatic const long adjustfield; / left

17、| right | internalstatic const long floatfield; / scientific | fixed另外,另外,ios 类有静态成员:类有静态成员:basefield 其值为其值为 dec | oct | hex adjustfield 其值为其值为 left | right | internalfloatfield 其值为其值为 scientific | fixed 第17页/共65页class _CRTIMP ios public:protected: int state; / 输入输出流出错状态字输入输出流出错状态字(其使用见其使用见14.8节节) l

18、ong x_flags; / 输入输出格式状态字输入输出格式状态字 int x_precision; / 输入输出精度输入输出精度 char x_fill; / 填充字符填充字符 int x_width; / 输出数据的域宽输出数据的域宽 .;C+系统提供了若干公有成员函数,对 x_flags、x_precision、x_fill 和 x_width 进行设置,并依据这些设置来控制不同的输入输出格式。第18页/共65页在在 ios 类中,定义了一个类中,定义了一个保护的保护的长整型成员,长整型成员,称为输入输出称为输入输出状态标志字状态标志字: protected: long x_flag;x

19、_flag 是是32位的位的(实际只用了低实际只用了低16位位),其每一个二进制位代表一种状态,其每一个二进制位代表一种状态,系统按照系统按照 x_flag 中指定的状态进行输入输出。中指定的状态进行输入输出。 . XXXX XXXX XXXX XXXXx_flagios:skipws=0 x0001 代表该位代表该位上述每个枚举常量代表一种输入输出状态。例:上述每个枚举常量代表一种输入输出状态。例:如果该位的值是如果该位的值是1(该位的缺省值是(该位的缺省值是1 ),),则输入时,跳过输入数据中的空白字符。则输入时,跳过输入数据中的空白字符。第19页/共65页 . XXXX XXXX XXX

20、X XXXXx_flag 经常用多个枚举常量组合成一个状态标志字,经常用多个枚举常量组合成一个状态标志字,用于控制输入输出格式,例用于控制输入输出格式,例: ios:oct | ios:showbase组合出组合出 x-flag :. 0000 0000 1010 0000 0 x00A0表示按八进制输出表示按八进制输出 ,并输出表示八进制数的前导,并输出表示八进制数的前导0ios:dec=0 x0010 代表该位代表该位表示按十进制输出表示按十进制输出ios:oct=0 x0020 代表该位代表该位表示按八进制输出表示按八进制输出ios:hex =0 x0040 代表该位代表该位表示按十六进

21、制输出表示按十六进制输出ios:showbase=0 x0080 代表该位代表该位表示输出数字前导字符表示输出数字前导字符第20页/共65页因为因为 x_flag 是是ios类保护成员,类保护成员,ios类的派生类对类的派生类对象象 cin、cout等等不能直接访问它,所以不能直接访问它,所以 ios 类提供类提供了一些公有成员函数来设置了一些公有成员函数来设置 x_flag 的各个状态位的各个状态位 。 (见表见表14-2 )下面举例:第21页/共65页原因:缺省状态下, ios:skipws值为1,空白字符: n 空格。例例14.6:使用成员函数,控制输入时是否提取空白字符:使用成员函数,

22、控制输入时是否提取空白字符#include void main( ) char c, str80; int i=0; cin c ; while( c!=n ) stri+=c ; cin c ; stri=0; cout str endl;运行时输入运行时输入:abcdefghij. 运行状况如何?运行状况如何?跟踪调试发现:跟踪调试发现:cin c ; 不提取不提取n解决办法:解决办法:在此位置加入语句:在此位置加入语句: cin.unsetf(ios:skipws);实际: 永远不停第22页/共65页例例14.7 使用成员函数,控制输入格式使用成员函数,控制输入格式#include vo

23、id main( ) char c1, c2, c3; cin.unsetf(ios:skipws); /设置不跳过空白字符设置不跳过空白字符 cinc1c2c3; coutc1c2c3#xy; coutx,yendl;运行结果:运行结果:a b c /输入的输入的a,b,c之间分别有一个空格之间分别有一个空格a b#10 20 /输入输入12, 16第23页/共65页14.3.2 使用操纵算子进行格式控制使用操纵算子进行格式控制在在 iomanip.h 中预定义了一些操纵算子,中预定义了一些操纵算子,表表14-3,用于控制流格式。用于控制流格式。常用的有常用的有 dec、oct、hex、ws

24、、endl、flush、setw( )第24页/共65页例例14.9 使用操纵算子控制输入输出格式使用操纵算子控制输入输出格式 #include #include /必须要包含此头文件必须要包含此头文件void main( ) int x, y, a, b; cinhexxy; cinoctab; coutsetw(8)setfill(*)x, setfill($)setw(4)yendl; coutsetiosflags(ios:left) a,setw(8)bendl; 运行结果:运行结果:10 2010 20*16,$328,16$第25页/共65页例例14.11 使用操纵算子控制浮点数

25、的输出精度。使用操纵算子控制浮点数的输出精度。#include #include void main( )double x=12.3456789;coutxendl;coutsetprecision(4)xendl;cout.setf(ios:fixed, ios:floatfield); /设置以定点数格式输出设置以定点数格式输出coutxendl;cout.setf(ios:scientific, ios:floatfield); /设置以科学表示法格式输出设置以科学表示法格式输出coutsetprecision(2)xendl;运行结果:运行结果:12.3457 /6位有效数字位有效数字

26、12.35 /4位有效数字位有效数字12.3457 /小数点后小数点后4位数字位数字1.23e+001 /小数点后小数点后2位数字位数字第26页/共65页14.4 用成员函数实现输入输出用成员函数实现输入输出 14.4.1 输出函数输出函数 在在ostream类中定义了一些公有成员函数,用于输出。类中定义了一些公有成员函数,用于输出。ostream & ostream:put(char );ostream & ostream:put(unsigned char );ostream & ostream:put(signed char );ostream & ost

27、ream:write(const char *, int);ostream & ostream:write(const unsigned char *, int);ostream & ostream:write(const signed char *, int);ostream& flush( ); /刷新输出流刷新输出流 例:例:int i=97; cout.put( char(i) ); char c=*; cout.put( c ); cout.write(abcd, 2);运行结果:运行结果:a*ab表示输出字符串前 n 个字符第27页/共65页int istr

28、eam:get( );istream & istream:get(char &);istream & istream:get(unsigned char &);istream & istream:get(signed char &);istream & istream:get(char *, int , char=n);istream & istream:get(unsigned char *, int , char=n);istream & istream:get(signed char *, int , char=n)

29、;istream & istream:getline(char *, int , char=n);istream & istream:getline(unsigned char *, int , char=n);istream & istream:getline(signed char *, int , char=n);14.4.2 输入函数输入函数在在istream类中定义了一些公有成员函数,控制输入。类中定义了一些公有成员函数,控制输入。 注意注意 get( ) 和和 getline( ) 的区别!的区别!第28页/共65页例:例: 读取字符和字符串读取字符和字符串

30、void main( ) char c1, c2, c3; char str180, str2100; cout输入三个字符输入三个字符:; c1=cin.get( ); cin.get(c2); cin.get(c3); cin.get( ); cout输入第一行字符串输入第一行字符串:; cin.get(str1,80); cin.get( ); cout输入第二行字符串输入第二行字符串:; cin.getline(str2,80);运行:运行:abccomputeroperator/读取第一行后的回车读取第一行后的回车/读取第二行后的回车读取第二行后的回车/第三行后的回车自动被提取第三行

31、后的回车自动被提取第29页/共65页续:续: cout.put(c1).put(c2).put(c3).put(n); cout.write(str1, 3); cout.write(str2, strlen(str2); cout.put(n);输出结果:abccomoperator第30页/共65页例例14.14 输入成员函数的使用输入成员函数的使用 #include #include void main( ) char buf20, max20; int cnum, mc=0; while(cin.getline(buf, 20) / A 提取一行字符,读取并舍弃行尾标志提取一行字符,读

32、取并舍弃行尾标志n cnum = cin.gcount( ); / B 获取获取A行的行的getline( )实际读取的字符个数实际读取的字符个数if(cnummc) mc=cnum; strcpy(max, buf); coutlen=cnum-1,bufendl; / C coutmax len=mc-1,maxendl; / D第31页/共65页程序的运行状况是:程序的运行状况是:an applelen=8, an applevery goodlen=9, very goodpear? len=5, pear?ok! len=3, ok!Z /输入输入Ctrl+z,表示输入流结束。,表示

33、输入流结束。max len=9, very good程序功能:输入若干行字符(假定每行少于20个字符),输出每行的字符个数,最后将最长的行及其长度输出。 第32页/共65页14.5 重载插入和提取运算符重载插入和提取运算符 istream 和和 ostream 类对标准类对标准数据类型,数据类型,已已定义了定义了 重载运算符重载运算符: 提取运算符提取运算符 和和 插入运算符插入运算符 和和 c1 ; cout 和和 x; 则自动解释成则自动解释成 cin.operator(x);第33页/共65页例例14.18 用友元函数实现复数类对象用友元函数实现复数类对象 插入和提取运算符重载函数插入和

34、提取运算符重载函数 程序见程序见 “第第14章章 输入输出流输入输出流(例子例子).doc”或教材。或教材。第34页/共65页14.6 文件流类文件流类 前已述,前已述,“文件文件”指指:(1) 磁盘文件磁盘文件(2) 设备文件设备文件(如键盘、显示器、打印机等如键盘、显示器、打印机等)本节特别介绍:本节特别介绍: 磁盘文件磁盘文件文本文件文本文件中存放的是中存放的是“文本流文本流”- 一串一串 ASCII 字符字符二进制文件二进制文件中存放的是中存放的是“二进制流二进制流” - 按内存的二进制格式存放(内存映象)按内存的二进制格式存放(内存映象)在在“流流”中的数据是以字节为单位的。中的数据

35、是以字节为单位的。文件操作是指对文件中的内容进行读写。文件操作是指对文件中的内容进行读写。第35页/共65页14.6.1 文件流类体系文件流类体系在在流类流类体系中,包含体系中,包含文件流类文件流类体系体系iosistreamiostreamostreamstreambufifstreamofstreamfstreamfilebuf完成从文件提取数据完成向文件插入数据完成提取插入操作完成文件缓冲区管理第36页/共65页14.6.2 文件的打开和关闭文件的打开和关闭 文件的使用过程如下:文件的使用过程如下:(1) 定义一个文件流对象定义一个文件流对象(2) 打开文件打开文件(3) 对文件进行读写

36、操作对文件进行读写操作(4) 关闭文件关闭文件1. 定义一个文件流对象定义一个文件流对象 如:如:ifstream infile; /用于与一个用于与一个输入输入文件建立联系文件建立联系 ofstream outfile; /用于与一个用于与一个输出输出文件建立联系文件建立联系 fstream iofile; /用于与一个用于与一个输入输出输入输出文件建立联系文件建立联系使用文件流类,使用文件流类,必须包含头文件必须包含头文件“fstream.h”第37页/共65页如:如:infile.open(“myfile1.txt”); /打开打开 myfile1.txt 用于读用于读 outfile.

37、open(“myfile2.txt”); /打开打开 myfile2.txt 用于写用于写 iofile.open(“myfile3.txt”, ios:in| ios:out); /打开打开 myfile3.txt 用于读写用于读写ifstream infile;infile.open(“myfile1.txt”);ifstream infile(“myfile1.txt”);定义流对象和打开文件可合二为一:定义流对象和打开文件可合二为一:调用调用成员成员函数函数打开文件。打开文件。调用调用构造构造函数函数打开文件。打开文件。2. 打开文件open( ) 函数格式第38页/共65页打开文件成

38、员函数打开文件成员函数 格式:格式:void fstream:open(const char *, int, int=filebuf:openprot);void ifstream:open(const char *, int=ios:in, int=filebuf:openprot);void ofstream:open(const char *, int=ios:out, int=filebuf:openprot);打开的文件名文件的打开方式参数 ios: 意义第39页/共65页在在 ios 类中,定义了一个类中,定义了一个公有的公有的无名枚举成员,无名枚举成员,用于定义文件的打开方式。用

39、于定义文件的打开方式。enum open_modein=0 x01, /按按读读方式打开文件方式打开文件out=0 x02, /按按写写方式打开文件方式打开文件ate=0 x04, app=0 x08, /按按增补增补(追加追加)方式打开文件方式打开文件trunc=0 x10, nocreate=0 x20,noplace=0 x40, binary=0 x80, /打开打开二进制二进制文件文件;引用方式为:引用方式为:ios:in ios:outios:in|ios:binary ios:out |ios:binary 等等等等第40页/共65页与与 cin 和和 cout 的用法相同的用法

40、相同 如:如:infile x; outfile y;3. 对文件进行读写操作在对文件进行读写时,我们将文件看成在对文件进行读写时,我们将文件看成字符流字符流, 文件流文件流 读写位置指针读写位置指针随着文件的读写,指针移动。随着文件的读写,指针移动。 第41页/共65页4. 关闭文件关闭文件void ifstream:close( );void ofstream:close( );void fstream:close( );如:如:infile.close( ); /切断与输入文件切断与输入文件 myfile1.txt 的联系的联系 outfile.close( ); /切断与输出文件切断与

41、输出文件 myfile2.txt 的联系的联系 iofile.close( ); /切断与输入输出文件切断与输入输出文件 myfile3.txt 的联系的联系文件读写完毕,必须关闭。 关闭文件成员函数 格式 :第42页/共65页14.6.3 文本文件的读写文本文件的读写例例 14.21 将数值将数值1100及其平方根写入文件及其平方根写入文件 sqrttable.txt #include #include #include void main( ) double x; ofstream out; / 定义一个输出流对象定义一个输出流对象 out.open(sqrttable.txt); / 打

42、开文本文件打开文本文件sqrttable.txt for(x=1; x=100; x+)outxtsqrt(x)endl; / 将结果写入文件将结果写入文件 out.close( ); / 关闭文件关闭文件演示并察看结果文件第43页/共65页例例 14.22 编写一个程序,用于显示一个文本文件编写一个程序,用于显示一个文本文件 #include #include #include void main( )char filename40, line80;ifstream infile; coutfilename; / A infile.open(filename); / B 第44页/共65页i

43、f(!infile) coutCan not open file: filenameendl;exit(1);while(infile.getline(line, 80) / 读入一行读入一行coutlinech) / 读入一个字符读入一个字符 coutch; / 显示一个字符显示一个字符演示第45页/共65页例例 14.24 编一个程序用于复制文本文件编一个程序用于复制文本文件 程序见程序见 “第第14章章 输入输出流输入输出流(例子例子).doc”或教材。或教材。演示例例 14.25 从一个文本文件从一个文本文件source.txt中读入若干整数,中读入若干整数, 用选择法将这些数据排成升

44、序,用选择法将这些数据排成升序, 将排序后的结果写入将排序后的结果写入 另一个文件文本文件另一个文件文本文件target.txt中中事前准备数据文件:事前准备数据文件: source.txt 程序见程序见 “第第14章章 输入输出流输入输出流(例子例子).doc”或教材。或教材。演示第46页/共65页14.6.4 二进制文件的读写二进制文件的读写 1. 文件的读写操作(成块读写)文件的读写操作(成块读写)成员函数:成员函数:istream & istream:read( char *, int );istream & istream:read( unsigned char *,

45、 int );istream & istream:read( signed char *, int );ostream & ostream:write( const char *, int );ostream & ostream:write( const unsigned char *, int );ostream & ostream:write( const signed char *, int );前三个为读取操作前三个为读取操作:将第二个参数指定的字节数读入到:将第二个参数指定的字节数读入到 以第一个参数为起始地址的内存中。以第一个参数为起始地址的内存中。

46、 后三个为写操作后三个为写操作:从第一个参数为起始地址的内存开始,:从第一个参数为起始地址的内存开始, 将连续的第二个参数指定字节数的将连续的第二个参数指定字节数的 内容写到文件中。内容写到文件中。 第47页/共65页例例 14.28 读入文本文件读入文本文件data.txt 中的数据,中的数据, 写入二进制文件写入二进制文件data.bin中中 。假定文本文件data.txt的内容如下 1 2 4 6 9 10 11 15 程序见 “第14章 输入输出流(例子).doc”或教材。例例 14.27 从键盘输入若干学生的信息,写入二进制文件,从键盘输入若干学生的信息,写入二进制文件,再从该二进制

47、文件中读出学生的信息,输出到屏幕上。再从该二进制文件中读出学生的信息,输出到屏幕上。 程序见 “第14章 输入输出流(例子).doc”或教材。第48页/共65页14.7 文件的随机访问文件的随机访问.文件内容文件内容读写位置指针读写位置指针读写数据后自动移动读写数据后自动移动读写位置指针读写位置指针istream类和类和ostream类类提供成员函数提供成员函数 ,控制读写位置指针的移动,控制读写位置指针的移动,实现文件的随机读写。实现文件的随机读写。文件刚打开时:文件刚打开时:第49页/共65页控制读写位置指针的成员函数:控制读写位置指针的成员函数:istream & istream

48、:seekg( streampos ); istream & istream:seekg( streamoff, ios:seek_dir );streampos & istream:tellg( );ostream & ostream:seekp( streampos );ostream & ostream:seekp( streamoff, ios:seek_dir );streampos & ostream:tellp( );前三个:适用于输入文件前三个:适用于输入文件 get 后三个:适用于输出文件后三个:适用于输出文件 put其中其中: 在在

49、ios 类中定义类中定义 typedef long streamoff ; /offset typedef long streampos; /position所以所以, 本质上本质上, streamoff 和和 streampos 就是就是long 类型类型第50页/共65页控制读写位置指针的成员函数:控制读写位置指针的成员函数:istream & istream:seekg( streampos ); istream & istream:seekg( streamoff, ios:seek_dir );streampos & istream:tellg( );ostr

50、eam & ostream:seekp( streampos );ostream & ostream:seekp( streamoff, ios:seek_dir );streampos & ostream:tellp( );另外,在另外,在 ios 类中定义枚举类型:类中定义枚举类型: enum seek_dir beg=0, /文件开始处,使用文件开始处,使用 ios:beg cur=1, /当前位置,当前位置, 使用使用 ios:cur end=2 /文件结束处,使用文件结束处,使用 ios:end;用于指定移动文件用于指定移动文件指针时的参照点。指针时的参照点。

51、第51页/共65页控制读写位置指针的成员函数:控制读写位置指针的成员函数:istream & istream:seekg( streampos );istream & istream:seekg( streamoff, ios:seek_dir );streampos & istream:tellg( );ostream & ostream:seekp( streampos );ostream & ostream:seekp( streamoff, ios:seek_dir );streampos & ostream:tellp( );表示将指针

52、表示将指针绝对移动绝对移动到到 streampos 字节处。字节处。按按ios:seek_dir指定的参照点位置,指定的参照点位置,将指针相对将指针相对移动移动到到 streamoff 字节处。字节处。返回指针的当前位置返回指针的当前位置(相对于文件开始的相对于文件开始的字节数字节数)。同理得出后三个函数的功能!同理得出后三个函数的功能!第52页/共65页例例 14.29 将将Fibonnaci数列的前数列的前40项写入二进制文件项写入二进制文件fib.bin中,然后输出其中的奇数项,每行输出中,然后输出其中的奇数项,每行输出5个数。个数。 #include #include #include

53、 #include void main( )fstream iofile(fib.bin, ios:in|ios:out|ios:binary); if(!iofile) coutCan not open file: fib.binendl;exit(1); 第53页/共65页例例 14.29 续续1 streampos pos = iofile.tellp( ); coutBegin posi=posendl;int f1=1, f2=1;for(int i=0; i20; i+)iofile.write(char*)&f1, sizeof(int);iofile.write(cha

54、r*)&f2, sizeof(int);f1=f1+f2;f2=f2+f1;pos=iofile.tellp( ); /获取当前位置获取当前位置coutEnd posi=posendl;第54页/共65页例例 14.29 续续2 iofile.seekp(0, ios:beg); /将读写位置指针重新定位于文件起始位置将读写位置指针重新定位于文件起始位置 for(i=0; i20; i+)iofile.read(char*)&f1, sizeof(int); /读入读入iofile.seekg(sizeof(int), ios:cur); /移动移动coutsetw(10)f1

55、;if(i+1)%4=0) coutendl;iofile.close( );第55页/共65页14.8 输入输出流的出错处理输入输出流的出错处理 ios类中,有一个类中,有一个输入输出输入输出出错状态字出错状态字state,各状态位由各状态位由ios类中定义的枚举常量来表示:类中定义的枚举常量来表示:enum io_state goodbit = 0 x00, / 表示状态正常表示状态正常 eofbit = 0 x01, / 表示达到了文件结尾表示达到了文件结尾 failbit = 0 x02, / 表示表示I/O操作失败操作失败 badbit = 0 x04 / 表示试图进行非法操作表示试

56、图进行非法操作 ; 在使用流进行输入输出操作时,可能会出现一些错误。在使用流进行输入输出操作时,可能会出现一些错误。如当程序中需要输入整型数时,在输入流中却出现了如当程序中需要输入整型数时,在输入流中却出现了字符。字符。 C+提供一套类机制,用于检测输入输出流状态,以提供一套类机制,用于检测输入输出流状态,以发现错误并清除错误状态。发现错误并清除错误状态。 第56页/共65页ios 类提供了几个内联函数,用于完成查看状态字类提供了几个内联函数,用于完成查看状态字state中中的各个状态位、清除状态字等工作。的各个状态位、清除状态字等工作。各函数的功能是:各函数的功能是: rdstate( )

57、返回当前状态字返回当前状态字operator!( ) ! 运算符重载,与运算符重载,与fail( )函数功能相同函数功能相同bad( ) 如果如果badbit被置位,返回真,否则返回假被置位,返回真,否则返回假clear(int _i=0) 用参数用参数 _i 置新的状态字置新的状态字eof( ) 如果如果eofbit被置位,返回真,否则返回假被置位,返回真,否则返回假fail( ) 如果如果badbit或或failbit被置位被置位,返回真返回真,否则返回假否则返回假good( ) 如果无任何错误返回真,否则返回假如果无任何错误返回真,否则返回假第57页/共65页例例14.31 出错处理函数

58、的使用出错处理函数的使用#include void main( ) double aver = 0, a5; char temp80; for(int i=0; i5; i+) cout请输入第请输入第i+1 ai; while(cin.rdstate( ) / 若遇到错误若遇到错误 cin.clear( ); / 清除出错状态,清除出错状态, 但错误的输入依然留在输入缓冲区中但错误的输入依然留在输入缓冲区中 cin.getline(temp,80); / 将缓冲区中的错误输入连同将缓冲区中的错误输入连同 回车一起读入到回车一起读入到temp,丢弃,丢弃第58页/共65页 couttemp为非法输入为非法输入!n; cout请重新输入第请重新输入第i+1ai;aver += ai;

温馨提示

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

评论

0/150

提交评论