《c++的io流库》由会员分享,可在线阅读,更多相关《c++的io流库(54页珍藏版)》请在金锄头文库上搜索。
1、补充内容:第10章 C+的I/O流库l10.1 流抽象的继承结构l10.2 预定义的插入符与提取符l10.3 插入符和提取符的重载l10.4 磁盘文件的输入和输出l10.5 字符串流10.1 流抽象的继承结构1、流的基本概念l在C+中,语言本身并不包含输入和输出功能 ,但C+标准库提供了一套用于输入和输出的类 库。l在C+的输入、输出系统中,最核心的对象是 流(stream),一个流就是一个字节序列。流的操 作包括对流的读和写。lC+输入输出流的思想:令标准I/O、文件和存 储块看上去都一样,只需记住一个接口就可以了 。与标准C输入输出库的各种函数相比,输入输 出流更容易、更安全、更有效。10
2、.1 流抽象的继承结构(续)ios:对流状态进行设置,虚基类;istream、ostream、iostream:提取与插入;streambuf:提供对数据的缓冲支持;2、C+流的继承结构iosstreambufistreamostreamiostream10.1 流抽象的继承结构(续)3、文件的继承结构fstreambasefilebufifstreamofstreamiofstream fstreambase:公共基类; ifstream、ofstream、iofstream:文件操作; filebuf:提供对上述类的缓冲支持;10.1 流抽象的继承结构(续)4、字符串类提供处理内部初始化字
3、符序列的操作;istrstream:从序列中取字符;ostrstream:将字符放入序列;10.1 流抽象的继承结构(续)cout:ostream类对象,处理标准输出,即屏幕输 出;cerr:ostream类对象,处理标准出错信息,提供 不带缓冲区的输出;clog:ostream类对象,处理标准出错信息,提供 带缓冲区的输出;5、预定义的流 cin:istream类对象,处理标准输入,即键盘输 入;10.2.1 预定义的插入符1、预定义插入符的格式ostreamint a=100;int *pa=cout void main() cout #include void PrintString(c
4、har *s) cout.write(s,strlen(s).put(n);cout.write(s,6)(type其中:type为char、int、short、long类型和它们的 unsigned和signed类型,以及float、double、long double、 char *;2、说明 一般情况下将提取符作用于cin对象; 输入语句中可以串联多个提取运算符,每个提取 符后为一表达式,该表达式是获得输入值的变量 或对象;10.2.2 预定义的提取符(续) 提取操作时,空白符(空格、tab键、换行符) 只用于字符的分隔符,而本身不作为从输入流中 提取的字符; 提取符可从输入流中读取一个
5、字符串,该字符串 是以空白符结束的一个字符序列,由系统自动加 上0字符;10.2.2 预定义的提取符(续) 例10.4:分析下列程序的输出结果。 #include #include void main() const int SIZE=20;char bufSIZE;char *largest;int curLen,maxLen=-1,cnt=0;coutbuf)curLen=strlen(buf);cnt+;if(curLenmaxLen)10.2.2 预定义的提取符(续)maxLen=curLen;largest=buf;cout输 出68continue输入ctrl+z键后,cinbuf
6、 的值为0,退出while循环;10.2.2 预定义的提取符(续)3、使用get()获取一个字符istreamchar istream:get();4、使用getline()获取多个字符istream说明:vgetline()最多可读取Limit-1个字符;10.2.2 预定义的提取符(续)从输入流中读取Limit-1个字符后;从输入流中读取换行符或其他终止符后;从输出流中读取到文件或输入流结束符后;vgetline()通常用来读取一行字符5、使用read()读取一串字符istreamvgetline()函数结束操作的条件:10.2.2 预定义的提取符(续) 例10.5:分析下列程序的输出结果
7、。 #include void main() char ch;cout输出abc xyz 123 10.2.2 预定义的提取符(续) 例10.6:分析下列程序的输出结果。 #include void main() const int S=12;char bufS=“;coutefghijkl10.3 插入符和提取符的重载1、重载为友元函数ostream 2、函数调用形式ostrmobj; 等价于 operator (istrm,obj); istrmobj1obj2; 等价于 operator (operator(istrm,obj1),obj2);10.3 插入符和提取符的重载(续 )例10
8、.7:分析下列程序的输出结果。 #include class Date public:Date(int y,int m,int d)Year=y;Month=m;Day=d;friend ostream10.3 插入符和提取符的重载(续)private:int Year,Month,Day; ; ostreamreturn stream; void main()10.3 插入符和提取符的重载(续 )Date CDate(1999,10,22);coutCDate;cout void main() ofstream ostrm;ostrm.open(“f1.dat“);ostrmnd;cout
9、#include #include void main() fstream outfile;outfile.open(“f2.dat“,ios:out);if(!outfile)cout #include #include void main() fstream infile;infile.open(“f2.dat“,ios:in);if(!infile)cout #include #include #include void main() fstream outfile,infile;outfile.open(“f3.dat“,ios:out);if(!outfile)cout #inclu
10、de #include void main() fstream outfile,infile;infile.open(“f2.dat“,ios:in);if(!infile)cout #include #include struct person char name20;double height;int age; struct person people4=“Wang“,1.65,25, “Zhang“,1.72,24, “Li“,1.89,21, “Huang“,1.70,22; void main() fstream outfile,infile;10.4.3 二进制文件的读写操作(续
11、)outfile.open(“f5.dat“,ios:out|ios:binary);if(!outfile)cout #include #include void main() struct studentchar name20;long number;double totalscore;struct stu5=“Ma“,97001,85.72,“Li“,97002,92.62,“Hu“,97003,89.25,“Yan“,97004,90.84,“Lu“,97005,80.92;10.4.4 随机访问数据文件(续)fstream file1;student one;file1.open(“
12、f6.dat“,ios:out|ios:in|ios:binary);if(!file1)cout #include const int N=80; void main() char bufN;ostrstream out1(buf,sizeof(buf);int a=50;for(int i=0;i #include void main() char buf=“123 45.67“;int a;double b;istrstream ss(buf);ssab;cout #include void main() char buf=“12345“;int i,j;istrstream s1(bu
13、f);s1i;istrstream s2(buf,3);s2j;couti+jendl; 输出:12468本章小结l对于流的操作:除了读和写之外,还应注意流 的建立和删除。l对于文件流的操作,打开文件、完成对文件的 读或写操作后,不要忘记关闭文件。lC+的输入输出流较之C的I/O系统操作起来更简 洁、更易理解,同时可利用重载运算符扩展对新 数据类型的认知。l经过学习之后,要求能熟悉三种流的特点,能 够熟练的利用文件流建立和读写文件。作业:编写一个关于通讯录的程序可输入姓名、电话(可多个)、通讯地址 、Email等必要的信息;可根据姓名查询电话等信息(最好还能根据电话查询姓名),并显示在屏幕上;要求通讯录保存成文件,如张三.txt,用文件流的方式实现;最好用面向对象方法编写。