第11章C语言的I∕O流类库.ppt
《第11章C语言的I∕O流类库.ppt》由会员分享,可在线阅读,更多相关《第11章C语言的I∕O流类库.ppt(65页珍藏版)》请在三一文库上搜索。
1、第11章 C+语言的I/O流类库,本章的最主要目的就是把对象保存到磁盘文件中并从磁盘文件重建对象。当然C+可完成更多的任务。 C+语言中并没有输入/输出语句,而是在标准库里包含了一个I/O流类库,它与标准模板库同为C+标准库中最重要的组成部分。数据从一个对象到另一个对象的传送被抽象为“流”。数据的输入/输出就是通过输入/输出流来实现的。 流是一种抽象的概念,负责在数据的产生者和数据的使用者之间建立联系,并管理数据的流动。,第11章 C+语言的I/O流类库,11.1 I/O流类库的功能,11.3 格式化输入输出 操作,11.2 常用的读写操作,11.4 插入符和提取符 的重载,11.7 流错误处
2、理,11.5 磁盘文件的输入 和输出操作,下 课,11.6 字符串流操作,11.1 I/O流类库的功能,整个流类体系是一个派生类体系。按ANSI C+标准,类ios是抽象类,它的析构函数是虚函数,它的构造函数为保护的,作为所有基本流类的基类。VC+中有一个构造函数ios (streambuf*)为公有,与ANSI C+不同。,11.1 I/O流类库的功能 11.1.1 基本的I/O流类库,在流类库中,最重要的两部分功能为标准输入/输出(standard input/output)和文件处理。 在C+的流类库中定义了四个全局流对象:cin,cout,cerr和clog。可以完成人机交互的功能。
3、cin标准输入流对象,键盘为其对应的标准设备。 cout标准输出流对象,显示器为标准设备。 cerr和clog标准错误输出流,输出设备是显示器。 其中cin、cout和clog是带缓冲区的,缓冲区由streambuf类对象来管理。而cerr为非缓冲区流,一旦错误发生立即显示。 要使用这四个功能,必须包含文件。,11.1.2 文件I/O操作流类库,类ifstream由类istream单一派生,专门用来处理文件的输入操作。 类ofstream由类ostream单一派生,专门用来处理文件的输出操作。 类fstream由类iostream单一派生,专门用来处理文件的输入和输出操作。 类ifstream
4、、ofstream、fstream拥有公共基类: fstreambase。 利用上述类创建流对象,类中的成员函数open用来打开文件,成员函数close用来关闭文件,有关细节将在11.5节中讲述。,11.1.3 字符串流操作流类库,类istrstream由类istream单一派生,专门用来处理字符串的输入操作。 类ostrstream由类ostream单一派生,专门用来处理字符串的输出操作。 类strstream由类iostream单一派生,专门用来处理字符串的输入和输出操作。 类istrstream、ostrstream、strstream拥有公共基类: strstreambase。 有关字
5、符串流操作的细节将在11.6节中讲述。,11.2 常用的读写操作,11.2.1 屏幕输出操作 1.使用预定义的插入符j?i:j)endl; 如果不加(),将因运算顺序不对而编译出错。,【例11.1】插入符用法示例,#include #include void main( ) cout“字符串“This is a string.“的长度为:“; coutstrlen(“This is a string.“)endl; cout“字符串“This is a string.“占的空间为:“; coutsizeof(“This is a string.“)endl; 运行结果为17和18,因为strl
6、en是求字符串的长度,即字符串中字符的个数;sizeof是求占用内存的字节数,其中包括字符串结束标志空字符占用的内存。strlen在string.h中定义,sizeof是一个运算符。,【例11.2】输出变量地址值示例,#include void main( ) int x(100); int *px= 运行结果显示直接输出地址值时是十六进制,若要以十进制显示需做强制类型转换为长整型。,【例11.3】编写判断除数为0的整数除法程序,#include void fun(int i,int j) if(j)coutxy; fun(x,y); 请仔细阅读本程序,并与课本上的程序比较。,2.使用成员函数
7、put( )输出一个字符 put函数函数原型为:ostream 使用put函数向屏幕输出字符的格式为: cout.put(字符),【例11.4】用成员函数put( )输出一个字符的例子 #include void main( ) coutBEIJINGn; cout.put(B).put(E).put(I).put(J).put(I).put(N).put(G).put(n); char c1=65,c2=66,c3=67; cout.put(c1).put(c2).put(c3).put(n); 请仔细阅读本程序,注意函数put()的值是ostream类对象的引用,连续输出时连续加.put(
8、),3.使用成员函数write( )输出一个字符串 write函数函数原型为: ostream 使用write函数向屏幕输出字符的格式为: cout.write(字符指针,字符个数),【例11.5】用成员函数write( )输出一个字符串的例子 #include #include void print(char*s) cout.write(s,strlen(s).put(n);cout.write(s,6)n; void main( ) char*str=“我爱北京天安门!“; cout“字符串为:“str“n“; print(str); 请仔细阅读本程序,注意函数write( )的值是ost
9、ream类对象的引用,连续输出时连续加.write( ),11.2.2 键盘输入操作,1.使用预定义的提取符 是右移位运算符的重载,格式为: 输入流源头输入流目的地 需从键盘接收数据时,键盘就是输入流源头,输入流目的地应是变量名,头文件iostream.h中定义有istream类的全局对象cin就代表键盘。 提取符依次从输入源中提取一个数据项,连续提取时,数据项之间用空格、制表符、换行等空白符分隔。 如对语句cinxyz; 可键入:18 19 20,1.使用预定义的提取符,标准设备(键盘)输入是最不安全的,注意以下几点,可以避免错误: cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取时,
10、是从缓冲区中拿。如果一次输入过多,会留在那儿慢慢用,如果输入错了,必须在回车之前修改,如果回车键按下就无法挽回了。只有把输入缓冲区中的数据取完后,才要求输入新的数据。不可能用刷新来清除缓冲区,所以不能输错,也不能多输! 输入的数据类型必须与要提取的数据类型一致,否则出错,出错只是在流的状态字state(枚举类型io_state)中对应位置位(置1),程序继续。所以要提高健壮性,就必须在编程中加入对状态字state的判断。 空格和回车都可以作为数据之间的分格符,所以多个数据可以在一行输入,也可以分行输入。但如果是字符型和字符串,则空格(ASCII码为32)无法用cin输入,字符串中也不能有空格。
11、回车符也无法读入。,【例11.6】提取符用法示例,#include void main( ) int x,y; coutxy; cout(x,y“)n“; ,2.使用成员函数get( )输入一个字符串 get函数函数原型有多个,其中比较简单的2个是: char get( );、istream 前者提取的字符作为函数值,后者提取的字符放在参数c 使用get函数从键盘提取字符的格式分别为: cin.get( )、cin.get(字符变量),【例11.7】用成员函数get( )从键盘提取字符的例子 #include void main( ) char ch; cout 请仔细阅读本程序,注意函数ci
12、n.get( )的值是字符,#include void main( ) char ch1,ch2; cout“输入字符串:“; while(cin.get(ch1).get(ch2) cout.put(ch2).put(ch1); 请仔细阅读本程序,注意这种格式的函数get( )的值是istream类对象的引用,连续输入时连续加.get( ),【例11.8】使用成员函数get带参数的形式输入一个字符,#include const int N=40; void main( ) char s1N,s2N; couts1; /输入时遇空格、制表符、回车等结束,但这些结束符留在缓冲区中 cout“s1
13、=“s1endl; cin.get(s2,N); /从缓冲区中最多接收N-1个字符,放数组s2中,界定符为隐含换行符 cout“s2=“s2endl; 请仔细阅读本程序,注意get函数的第三种原型: istream 这种格式的函数get( )的值是istream类对象的引用,使用格式为:cin.get(字符指针,整数n,界定符) 该函数直接从缓冲区中最多读取n-1个字符数据,若前面遗留有换行,则结束。,【例11.9】混合使用成员函数get、提取符输入字符,比较区别,3.使用成员函数getline( )输入一行字符 getline函数原型是: istream 功能是最多提取n-1个字符放在buf
14、为首地址的缓冲区中,参数ch为终止符,隐含的终止符为换行符。 使用getline函数从键盘提取字符串的格式为: cin.getline(字符指针,整数n,终止界定符) 输入字符少于n-1时,接收实际输入字符数,并将缓冲区的回车符清除,若输入字符数不少于n-1时,多余的字符及回车符留在缓冲区。该函数不能接受换行字符(n)。该函数终止读取字符的条件为: 读取n-1个字符 遇到参数指定的终止符 遇到文件结束符(Ctrl+Z)或回车符。,【例11.10】输入若干行字符,求出最长行的字符个数及输入行数。使用成员函数getline( ) #include const int SIZE=80; void m
15、ain( ) char bufSIZE; int lcnt=0,lmax=-1; coutlmax)lmax=count; cout“line#“lcnt:countendl; cout.write(buf,count).put(n).put(n); coutendl; cout“最长行字符数:“lmaxendl; cout“总行数:“lcntendl; ,4.使用成员函数read( )输入一行字符 read函数原型是: istream 功能是最多提取n-1个字符放在buf为首地址的缓冲区中 使用read函数从键盘提取字符串的格式为: cin.getline(字符指针 ,整数n) 最多接收n个
16、字符,接受字符中可以包括换行符(n)。该函数终止读取字符的条件为: 读取n个字符 遇到文件结束符(Ctrl+Z)。,【例11.11】输入若干行字符,并输出。使用成员函数read( )。,#include void main( ) const int SIZE=80; char bufSIZE=“; cout、read、get、getline四种读取字符方法的异同(终止条件、可接受字符的范围、可接受字符的多少、使用格式、是否缓冲等)。,11.3 格式化输入输出操作,1.控制格式的标志位定义为公有的无名的枚举类型: enum skipws=0x0001, /跳过输入中的空白字符 left=0x00
17、02, /输出左对齐 right=0x0004, /输出右对齐 internal=0x0008, /在输出符号或数字字符后填充 dec=0x0010, /在输入输出时将数据按十进制处理 oct=0x0020, /在输入输出时将数据按八进制处理 hex=0x0040, /在输入输出时将数据按十六进制处理 showbase=0x0080, /在输出时带有表示数制基的字符,C+在类ios中提供格式化输入输出,有两种方法控制输入输出格式:一是使用标志位和成员函数,二是使用控制符。 11.3.1 使用成员函数进行格式输出,11.3 格式化输入输出操作,showpoint=0x0100, /输出浮点数时,
18、必定带小数点 uppercase=0x0200, /输出十六进制,用大写字母 showpos=0x0400, /输出正数时,加”+”号 scientific=0x0800, /科学计数方式输出浮点数 fixed=0x1000, /定点数方式输出实数 unitbuf=0x2000, /插入后,立即刷新流的缓冲区 stdio=0x4000 /插入后,立即刷新stdout和stderr,该枚举量说明中每一个枚举量实际对应两字节数据(16位)中的一个位,所以可以同时采用几个格式控制,只要把对应位置1即可,这样既方便又节约内存。取多种控制时,用或“|”运算符来合成,合成为一个长整型数,在ios中为: p
19、rotected: long x_flags; 这个长整型数据成员被称为标志字。,11.3 输入输出的格式控制,类ios中还设置了三个输入输出流格式控制标志: protected: int x_precision; /标志浮点数精度,缺省为6位 int x_width; /输出域宽,缺省域宽为0, /重设域宽只对其后第一输出项有效,如域宽不足,则不受限制 char x_fill; /标志域宽有富余时填入的字符,2. 设置标志字的成员函数 long flags( ) 返回标志字函数。 long flags(long) 函数值为更新前的标志字,参数作更新后的标志字,long setf(long s
20、etbits,long field) 该函数先将第二个参数(转换为二进制)中为1的标志位置0,再将第一个参数(转换为二进制)中为1的标志位置1 。函数值为设置前标志字。,long setf(long) 设置参数(转换为二进制)中为1的标志位置1,其余标志位不变。函数值未设置前的标志字。 long unsetf(long) 设置参数(转换为二进制)中为 1的标志位置0,其余标志位不变。函数值未设置前的标志字。,在ios中定义有如下静态整型常量:,static const long adjustfield; 其值=left|right|internal=0x2|0x4|0x8=0xe static
21、 const long basefield; 其值=dec|oct|hex=0x10|0x20|0x40=0x70 static const long floatfield; 其值=scientific|fixed=0x800|0x1000=0x1800 实际上,上述3个组合设置是有矛盾的,如中又要左对齐,又要右对齐是不可能的,自己可以编程测试实际结果,上述组合常用于清除标志位。 例如,若需清除数制标志后,再设置十六进制标志,可调用成员函数: cout.setf(ios:hex,ios:basefield),3. 控制输出格式的成员函数,IOS类中有如下控制输出格式的成员函数: int wid
22、th( ); int width(int); 前者函数值为当前输出的数据宽度;后者参数为设置的数据输出宽度,函数值为设置前的数据输出宽度值;默认为实际需要的最少字符数,设置宽度小于默认值时,设置无效。 char fill( ); char fill(char); 前者函数值为当前使用的填充字符;后者参数为设置的填充字符,函数值为设置前使用的填充字符;默认填充字符为空格。 int precision( ); int precision(int); 前者函数值为当前使用的浮点数有效数字个数;后者参数为设置的浮点数有效数字个数,函数值为设置前使用的浮点数有效数字个数;单精度最多7位(默认6位)有效数
23、字,双精度最多15位(默认6位)有效数字,长双精度最多19位(默认6位) 有效数字。,【例11.12】设置清除标志位的例子,#include void main( ) int a=1234;double b=12.345678; coutcout.flags( )endl; cout.setf(ios:hex,ios:basefield); coutcout.flags( )endl; coutaendl; cout.setf(ios:showbase);coutaendl; cout.setf(ios:uppercase);coutaendl; cout.setf(ios:oct,ios:b
24、asefield);coutaendl; long oldflag=cout.setf(ios:dec,ios:basefield); coutaendl; cout.setf(ios:showpos); coutaendl; cout.flags(oldflag); coutaendl; coutcout.flags( )endl;coutbendl; cout.setf(ios:scientific,ios:floatfield);coutbendl; coutcout.flags( )endl; /运行程序,观察结果。,【例11.13】设置控制小数位数的例子,#include void
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 11 语言 流类库
链接地址:https://www.31doc.com/p-2250816.html