大一下学期课件_第1页
大一下学期课件_第2页
大一下学期课件_第3页
大一下学期课件_第4页
大一下学期课件_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

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

文档简介

1、目录第1章第2章第3章第4章第5章第6章第7章第8章第9章C+概述数据类型、运算符和表达式简单的输入/输出C+的流程函数编译预处理数组FFFFFFFFFv 第一部分面向过程的程序设计结构体、指针和和枚举类型第10章第11章第12章第13章第14章第15章类和对象类和对象的其他特性继承和派生多态性输入/输出流模板FFFFFFv 第二部分面向对象的程序设计第14章输入/输出流类库14.114.214.314.414.514.614.714.8输入输出基本概念输入输出流类体系输入输出格式使用成员函数实现输入输出重载和提取运算符文件流类文件的随机输入输出流的出错处理14.1 输入输出基本概念14.1.

2、1 输入输出流(Stream)流数据在程序和设备之间“”输出流输入流数据数据14.1.2 文本流、二进制流和数据文件文本流 - 一串ASCII 字符。二进制流按二进制格式存放的数据(内存映象)。逻辑设备内部程序逻辑设备区别:数值 12345 在 文本流中和二进制流中的形式:ASCII 形式:(文本流 , 字符串)在内存中int 型数据的形式:在“流”中的数据是以字节在二进制流中的形式:为的。0011000100110010001100110011010000110101'1''2''3''4''5'00000000

3、00000000001100000011100100000000000000000011000000111001整数 12345若存于文本文件中,占 5 个字节,即存放 5 个ASCII 字符(看成字符串)若存于二进制文件中,占 4 个字节,内存映象因为一个整数在内存中占 4 个字节数据文件用于存放信息:存放ASCII字符的文件称为文本文件。存放二进制数据的文件称为二进制文件。一个逻辑设备对应一个文件,“文件”指:(1) 磁盘文件(2) 设备文件(如键盘、显示器、打印机等)14.1.3 缓冲输入流输出流数据数据引入缓冲的目的是解决CPU的运行速度和外设操作速度不匹配的。如输出时先写入缓冲区,再

4、成批输出。成批写出数据比一个一个写出数据节约时间。一般地,缓冲区在内存中。内存缓冲区内存缓冲区逻辑设备逻辑设备内部程序14.2 输入输出流类体系14.2.1 基本输入输出流类流基类抽象缓冲区基类(输入输出)C+预定义了流类,用于完成数据的“ios通用输入流基类在这些已定义的类中,类给出了若干方法(成员函数),输入输出。流类基类cout、cerr、clog所属的输出流类cin所属的输入流类ostream_withassignistream_withassignstreambuf用于i使用上述流类,必须包含头文件 “ iostream.h”14.2.2用运算符重载实现标准设备的输入输出观察头文件i

5、stream.h :class istream : virtual public ios public:istream& operator>>(char *);/A 字符串输入重载函数/B 字符输入重载函数/C 整数输入重载函数istream& operator>>(char &);istream& operator>>(int &);istream& operator>>(double &); /D 实型数据输入重载函数;class istream_withassign : public

6、istream;extern istream_withassign cin;cin 是 istream_withassign 类对象,继承了重载运算符>>。编译器会将 cin>>x>>y;解释成 (cin.operator>>(x) .operator>>(y);返回 cin同理:C+还定义了三个输出流对象 cout、cerr 和 clog。这三个对象均是ostream_withassign类的对象,它们均在头文件ostream.h中被定义 cin标准输入流(输入设备是键盘) cout 标准输出流(输出设备是显示器) cerr 标准错

7、误输出流,没有缓冲,立刻输出。 clog 输出日志信息,有缓冲,缓冲区满后被输出。同理在ostream类中重载了<< 运算符编译器会将 cout<<x<<y;解释成 (cout.operator<<(x) .operator<<(y);返回 cout例14.2使用cout、cerr和clog#include <iostream.h>#include <math.h>voidmain( ) double x;cout<<"Please input x:" cin>>x;

8、if(x<0)/Acerr<<x<<" is not a positive number!n" return;/Bclog<<"The root of "<<x<<" is "<<sqrt(x)<<endl;/C在本例中,cout、cerr和clog的作用相同。而cerr和clog的区别在于,cerr是非缓冲输出, 而clog是缓冲输出。请看例14.3:例14.3体会cerr和clog的区别#include <iostream.h>v

9、oidmain( ) double x;clog<<"Please input x:" cin>>x;cout<<x<<endl;/A/B此程序在屏幕上的运行过程如下:5<回车>5Please input x:/输入/B行的输出/A行的输出:clog是缓冲输出,当缓冲区满或程序结束时,才“真正”输出到屏幕上。14.2.3缺省的输入输出格式1缺省的(默认的)输入格式©cin 是缓冲流,当输结束按回车(Enter)时,操作系统将输入内容放入输入缓冲区,然后 cin 从输入缓冲区提取数据。©输入数据的

10、类型必须与提取数据的变量类型一致。©输入数据时,在缺省的情况下,数据之间的分隔符为:<Space>键(空格键)、<Tab>键(制表键)或<Enter>键(回车键),这三个键通称为空白字符。如:charc1, c2, c3; cin>>c1>>c2>>c3;程序运行时,可输入:a<Space>b<Tab>c<Enter>也可输入:ab <Tab> c <Enter>或输入:a <Enter> b <Enter> c <Ente

11、r>在上述情况下,三个变量c1、c2和c3获得值均为 a、b 和c。应注意,最后输入的总是回车键。又如:char s120, s220;cin>>s1>>s2;输入ab<Space>cd<Enter> 或输入ab<Tab>cd<Enter> 或输入ab<Enter>cd<Enter>结果字符串s1和s2提取的值均分别为"ab"和"cd"。©回车< Enter > 起两个作用:表示一行结束,可进行提取操作了。可用它做数据分隔符。14.

12、2.3缺省的输入输出格式2缺省的(默认的)输出格式不同类型数据的输出有其缺省的(默认的)输出格式:©输出整型数:十进制、为0、右对齐、空格填充。©输出实型数:精度6位、浮点输出、为0、右对齐、空格填充。若整数部分超过7 位或有效数字在小数点后第4 位之后, 自动转为科学计数法格式输出。©输出字符或字符串:为0、右对齐、空格填充。例14.4标准输出的默认输出格式#include <iostream.h>#include <iomanip.h>voidmain( )double d1=12.3456789, d2=123456.789, d3=

13、0.0000123456;cout<<d1<<','<<d2<<','<<d3<<endl; cout<<setw(10)<<d1<<','<<setw(10)<<d2<<',<<setw(10)<<d3<<endl; char s10="abcd", c='k' cout<<s<<','

14、;<<setw(4)<<c<<endl;输出结果:12.3457, 123457, 1.23456e-005 12.3457, 123457, 1.23456e-005abcd, k注意: 表示空格14.3输入输出格式缺省的输入输出格式都可以改变:具体方法有两种。14.3.1使用成员函数在 ios 类中,定义了用于进行输入输出格完整内容见 “第14章enum/ 部分内容如下,含义见表141。skipws=0x0001,/跳过输入中的空白字符I.dec=0x0010,oct=0x0020, hex=0x0040,/将数据转换成十进制数/将数据转换成八进制数I/

15、OI/O/将数据转换成十六进制数 I/Oshowbase=0x0080, /输出时带有一个表示数制的字符 O.;另外,ios 类有静态成员:basefield 其值为dec | oct | hexadjustfield 其值为 left | right | internalfloatfield 其值为scientific | fixed在ios.h中的定义形式:static const long basefield;static const long adjustfield; static const long floatfield;/ dec | oct | hex/ left | righ

16、t | internal/ scientific | fixed类的静态成员必须在全局有一个定义性说明,并赋初值。class _CRTIMP ios public:protected:int long int char intstate; / 输入输出流出错状态字(其使用见14.8节)x_flags;/ 输入输出格式状态字/ 输入输出精度/ 填充字符/ 输出数据的x_precision; x_fill; x_width;.;C+系统提供了若干公有成员函数,对 x_flags、x_precision、x_fill 和 x_width 进行设置,并依据这些设置来不同的输入输出格式。在 ios 类中

17、,定义了一个保护的长整型成员,称为输入输出状态标志字:protected:longx_flag;x_flag 是32位的(实际只用了低16位), 其每一个二进制位代表一种状态,系统按照 x_flag 中指定的状态进行输入输出。上述每个枚举常量代表一种输入输出状态。例:x_flag.XXXXios:skipws=0x0001代表该位如果该位的值是1(该位的缺省值是1 ),则输入时,跳过输入数据中的空白字符。x_flag.XXXX表示按十进制输出ios:dec=0x0010代表该位ios:oct=0x0020表示按八进制输出代表该位ios:hex =0x0040 代表该位表示按十六进制输出ios:

18、showbase=0x0080代表该位表示输出数字前导字符经常用多个枚举常量组一个状态标志字,ios:oct | ios:showbase输入输出格式,例:用于组合出 x-flag :0x00A0表示按八进制输出 ,并输出表示八进制数的前导0. 0000 0000 1010 0000因为 x_flag是ios类保护成员,ios类的派生类对象 cin、cout等不能直接它,所以ios 类提供了一些公有成员函数来设置 x_flag 的各个状态位 。(见表14-2 )下面举例:例14.6:使用成员函数,输入时是否提取空白字符运行时输入:abcd<回车>efg<回车>#incl

19、ude < iostream.h > void main( )charc, str80;实际: 永远不停hij<回车>inti=0;.运行状况如何?cin >> c ; while( c!='n' )stri+=c ; cin >> c ;stri='0'跟踪调试发现:cin >> c ;不提取'n':缺省状态下, ios:skipws值为1,空白字符:<Tab> 'n' 空格。cout << str<< endl;例14.7使用成员函

20、数,输入格式#inclu运行结果:a b c<回车> /输入的a,b,c之间分别有一个空格void cha ab#cin 10 20<回车>/输入12, 16cin>>c1>>c2>>c3;cout<<c1<<c2<<c3<<'#'<<endl;cin.setf(ios:skipws);/ 设置为跳过空白字符cin.setf(ios:hex, ios:basefield); / 设置输入十六进制数int x, y; cin>>x>>y;

21、cout<<x<<','<<y<<endl;14.3.2使用算子进行格式在 iomanip.h 中预定义了一些算子,表14-3,用于流格式。常用的有 dec、oct、hex、ws、endl、flush、setw( )例14.9使用算子输入输出格式#include <iostream.h>#include <iomanip.h>/必须要包含此头文件voidmain( )int x, y, a, b; cin>>hex>>x>>y;cin>>oct>>

22、a>>b;cout<<setw(8)<<setfill('*')<<x<<', '<<setfill('$')<<setw(4)<<y<<endl; cout<<setiosflags(ios:left) <<a<<','<<setw(8)<<b<<endl;例14.11使用算子浮点数的输出精度。#include <iostream.h#inclu

23、de <iomanip.h运行结果:12.3457/6位有效数字/4位有效数字/小数点后4位数字voidmain( )double x=12.3 12.35cout<<x<<end12.3457cout<<setprec 1.23e+001/小数点后2位数字ision( )xendl;cout.setf(ios:fixed, ios:floatfield);/设置以定点数格式输出cout<<x<<endl;cout.setf(ios:scientific, ios:floatfield);/设置以科学表示法格式输出cout<

24、;<setprecision(2)<<x<<endl;14.4用成员函数实现输入输出14.4.1输出函数表示输出一个字符在ostream类中定义了一些公有成员函ostream & ostream:put(char );出。表示输出字符串前 n 个字符ostream & ostream:put(unsigned char ostream & ostream:put(signed char );ostream & ostream:write(const char *, int);ostream & ostream:write(c

25、onst 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*ab14.4.2输入函数在istream类中定义了一些公有成员函一个字符,不跳过空白字符intistream:get( );istream & istream:get

26、(char &);istream & istream:get(unsigned char &); istream & istream:get(signed char &);一行字符,不提取nistream & istream:get(char *, int , char='n');istream & istream:get(unsigned char *, int , c一行字符提取nistream & istream:get(signed char *, int , char='n );istream &

27、amp; istream:getline(char *, int , char='n');istream & istream:getline(unsigned char *, int , char='n');istream & istream:getline(signed char *, int , char='n');注意 get( ) 和 getline( ) 的区别!例:字符和字符串void main( )运行:abc<回车> computer<回车> operator<回车> char

28、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);续:cout.put(c1).put(c2).put(c3).put('n

29、'); cout.write(str1, 3);cout.write(str2, strlen(str2); cout.put('n');输出结果:abccomoperator例14.14输入成员函数的使用#include <iostream.h>#include <string.h>void main( )char buf20, max20; int cnum, mc=0; while(cin.getline(buf, 20)/ A 提取一行字符,并舍弃行尾标志'n'cnum = cin.gcount( );/ B 获取A行的g

30、etline( )实际if(cnum>mc)的字符个数mc=cnum; strcpy(max, buf);cout<<"len="<<cnum-1<<","<<buf<<endl; / Ccout<<"max len="<<mc-1<<","<<max<<endl;/ D程序的运行状况是:an apple<回车>len=8, an apple very good<回车>

31、; len=9, very good pear? <回车> len=5, pear?ok! <回车>len=3, ok!Z<回车>max len=9, very good/输入Ctrl+z,表示输入流结束。14.5重载和提取运算符 istream 和 ostream 类对标准数据类型,已定义了重载运算符: 提取运算符 >> 和运算符 << 。看头文件istream.hcin.operator>>(x);如:int x; cin>>x;则自动解释成 对用户新定义的数据类型如“复数”, 能否直接使用 >>

32、; 和 << 进行提取和操作呢?即 如果 Complexc1,c2;能否cin >> c1 ; cout << c2;回答:能!但必须在定义Complex 类时, 载运算符 >> 和 << 。例14.18元函数实现复数类对象和提取运算符重载函数程序见 “第14章 输入输出流(例子).doc”或。14.6 文件流类前已述,“文件”指:(1) 磁盘文件(2) 设备文件(如键盘、显示器、打印机等)本节特别介绍: 磁盘文件文本文件中存放的是“文本流”-一串ASCII 字符二进制文件中存放的是“二进制流”- 按内存的二进制格式存放(内存映象)在

33、“流”中的数据是以字节为的。文件操作是指对文件中的内容进行读写。14.6.1文件流类体系在流类体系中,包含文件流类体系filebuf完成提取操作完成文件缓冲区管理完成从文件提取数据完成向文件数据fstreamiostreamostreamistream14.6.2文件的打开和关闭文件的使用过程如下:(1) 定义一个文件流对象(2) 打开文件(3) 对文件进行读写操作(4) 关闭文件1. 定义一个文件流对象如:ifstream infile;/用于与一个输入文件建立ofstreamoutfile; /用于与一个输出文件建立fstreamiofile; /用于与一个输入输出文件建立open( )

34、函数格式2.打开文件如:infile.open(“myfile1.txt”); /打开 myfile1.txt 用于读outfile.open(“myfile2.txt”); /打开 myfile2.txt 用于写iofile.open(“myfile3.txt”, ios:in| ios:out);/打开 myfile3.txt 用于读写定义流对象和打开文件可合二为一:调用成员函数打开文件。调用构造函数打开文件。打开文件成员函数格式:无缺省值void voidvoidfstream:open(const char *,int,int=filebuf:openprot);ifstream:op

35、en(const char *, int=ios:in, int=filebuf:openprot);ofstream:open(const char *, int=ios:out, int=filebuf:openprot)打开的文件名文件的打开方式参数 ios: 意义文件打开时的保护方式,如:独占打开在 ios 类中,定义了一个公有的无名枚举成员,用于定义文件的打开方式。enumopen_modein=0x01, out=0x02, ate=0x04, app=0x08,trunc=0x10,/按读方式打开文件/按写方式打开文件/按增补(追加)方式打开文件位运算“|”或,组合条件nocre

36、ate=0x20, noplace=0x40,binary=0x80, /打开二进制文件:;ios:in ios:in|ios:binaryios:outios:out |ios:binary等等3.对文件进行读写操作与 cin 和 cout 的用法相同如:infile >> x;outfile << y;在对文件进行读写时,文件看成字符流,读写位置指针随着文件的读写,指针移动。4.关闭文件文件读写完毕,必须关闭。关闭文件成员函数 格式 :如:infile.close( );/切断与输入文件 myfile1.txt 的outfile.close( ); /切断与输出文件

37、 myfile2.txt 的iofile.close( ); /切断与输入输出文件 myfile3.txt 的14.6.3文本文件的读写例 14.21将数值1100及其平方根写入文件sqrttable.txt#include <iostream.h> #include <fstream.h> #include <math.h> void main( )double x;演示并察看结果文件ofstream out;/ 定义一个输出流对象out.open("sqrttable.txt"); for(x=1; x<=100; x+)/ 打

38、开文本文件sqrttable.txtout<<x<<'t'<<sqrt(x)<<endl; / 将结果写入文件out.close( );/ 关闭文件例 14.22编写一个程序,用于显示一个文本文件#include <iostream.h> #include <fstream.h> #include <stdlib.h> void main( )char filename40, line80;ifstreaminfile;cout<<"Please input a filen

39、ame: "cin>>filename; infile.open(filename);/ A/ B如果打开不infile 为 0,if(!infile)演示cout<<"Can not open file: "<<filename<<endl; exit(1);/ 读/ 显示一行改写为:例 14.24编一个程序用于文本文件演示程序见 “第14章 输入输出流(例子).doc”或。例 14.25从一个文本文件source.txt中读入若干整数,用选择法将这些数据排成升序, 将排序后的结果写入另一个文件文本文件target

40、.txt中事前准备数据文件: source.txt演示程序见 “第14章 输入输出流(例子).doc”或。14.6.4二进制文件的读写1.文件的读写操作(成块读写)成员函数:istream & istream:read( char *, int );istream & istream:read( unsigned char *, int ); istream & istream:read( signed char *, int );ostream & ostream:write( constchar *, int );ostream & ostream:

41、write( const unsigned char *, int ); ostream & ostream:write( const signed char *, int );前三个为操作:将第二个参数指定的字节数读入到以第一个参数为起始地址的内存中。后三个为写操作:从第一个参数为起始地址的内存开始,将连续的第二个参数指定字节数的内容写到文件中。例 14.28读入文本文件data.txt 中的数据, 写入二进制文件data.bin中。假定文本文件data.txt的内容如下程序见 “第14章 输入输出流(例子).doc”或。例 14.27从键盘输入若干学生的信息,写入二进制文件,再从该

42、二进制文件中读出学生的信息,输出到屏幕上。程序见 “第14章 输入输出流(例子).doc”或。14.7文件的随机文件内容文件刚打开时:读写位置指针读写数据后自动移动读写位置指针istream类和ostream类提供成员函数 ,读写位置指针的移动,实现文件的随机读写。.读写位置指针的成员函数:istream & istream:seekg( streampos );istream & istream:seekg( streamoff, ios:seek_dir );streampos & istream:tellg();ostream & ostream:seek

43、p( streampos );ostream & ostream:seekp( streamoff, ios:seek_dir );streampos & ostream:tellp();前三个:适用于输入文件 get后三个:适用于输出文件 put其中: 在 ios 类中定义typedef typedeflong longstreamoff ; streampos;/offset/position所以, 本质上, streamoff 和 streampos 就是long 类型读写位置指针的成员函数:istream & istream:seekg( streampos )

44、;istream & istream:seekg( streamoff, ios:seek_dir );streampos & istream:tellg();ostream & ostream:seekp( streampos );ostream & ostream:seekp( streamoff, ios:seek_dir );streampos & ostream:tellp();另外,在 ios 类中定义枚举类型:enum seek_dirbeg=0, cur=1, end=2/文件开始处,使用 ios:beg/当前位置,使用 ios:cur/

45、文件结束处,使用 ios:end;用于指定移动文件指针时的参照点。读写位置指针的成员函数: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()

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

47、uot;fib.bin", ios:in|ios:out|ios:binary);if(!iofile)cout<<"Can not open file: fib.bin"<<endl; exit(1);例 14.29续1streampos pos = iofile.tellp( );cout<<"Begin posi="<<pos<<endl; int f1=1, f2=1;for(int i=0; i<20; i+)iofile.write(char*)&f1, sizeof(int); iofile.write(char*)&f2, sizeof(int); f1=f1+f2;f2=f2+f1;pos=iofile.tellp( );/获取当前位置cout<<"End posi="<<pos<<endl;例 14.29续2iofile.seekp(0, ios:beg);/将读写位置指针重新for(i=0; i<20; i+)于文

温馨提示

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

评论

0/150

提交评论