第十章IO流.ppt
《第十章IO流.ppt》由会员分享,可在线阅读,更多相关《第十章IO流.ppt(52页珍藏版)》请在三一文库上搜索。
1、第十章 I/O流,10.1 C+流库概述,所谓“流”,就是数据从源(数据的生产者)到漏(数据 的消费者)的流动。 可以把一个流简化地理解为,提供字符的源(称为输 入流)或收集字符的漏(称为输出流)。 C+流库是C+语言为完成输入/输出工作而预定义 的类的集合,这些类构成一个层次结构的系统。 streambuf类主要负责缓冲区的处理。图10.1为它们 之间的层次关系。,10.1 C+流库概述,图10.1strstreambuf类及其派生类,所谓“流”,就是数据从源(数据的生产者)到漏(数据的消费者)的流动。,10.1 C+流库概述,filebuf类扩充了streambuf类的功能,它能够处理文件
2、。把filebuf 同某个文件的描述字相联系就称为打开这个文件。 conbuf类也扩充了streambuf类的功能,它能处理输出,为输出 操作提供缓冲区管理。 ios类及其派生类为用户提供了使用流类的接口。输出流(ostream) 针对系统全部预定义类型重载了输出运算符“”,它提供了流的主要 输出操作;文件流(fstreambase)提供了文件流的公共操作;串流 (strstreambase)专门处理串流。 请参考教材图10.2 ios类及其派生类。,图10.2 ios类及其派生类,10.1 C+流库概述,当开始执行C+程序时,系统将自动打开几个预定义 流,用户可以在程序中直接使用它们,它们是
3、: cin,称为标准输入流,缺省时为键。如: int m,n; cinmn; /100 22输入时数据间加以空格 cout,称为标准输出流,缺省时为显示器 。如: int x = 9; cout“x = “xendl; / x = 9 cerr和clog都是ostream_withassign类的对象,称为标准 错误输出流,固定关联到 显示器。,#include #include using namespace std; void main() string in_string; / 向用户终端写字符串 cout in_string; if ( in_string.empty() ) / 产生
4、一个错误消息输出到用户终端 cerr “error: input string is empty!n“; else cout “hello, “ in_string “!n“; ,10.2 预定义类型的输入/输出,istream流类相对于系统预定义类型把运算符 “”重载为输入运算符;ostream流类相对于系 统预定义类型把运算符“”重载为输出运算符。,10.2.1 istream流类,istream类中有如下的主要成员函数: get函数 从流中把字符输入到给定的char*,直到遇到分界符、文件结束符或 已读完(len-1)个字符为止: istream , getline函数 由于程序员常常忘
5、了在应用get()之前丢弃 换行符n, 所以使用成员函数getline()要比get()更好,因为它丢弃换行符n,而不是将其留作istream 的下一个字符。getline()的语法与get()的三参数形式相同,(它也返回被调用的istream 对象): istream 它们的功能是,从流中提取给定数目的字符到数组char*中。出 错时可以用函数gcount得到实际读入的字符数。 下面演示一个使用get,getline 和read读出文件内容的例子。,10.2.1 istream流类,#include #include using namespace std; void main() char
6、 ch,c030,c130,*p=“abcde fghij klmno pqrst uvwsyz“; ofstream tfile(“aaa.txt“); tfile.write(p,strlen(p)+1);/写入文件 tfile.close(); ifstream in0(“aaa.txt“); in0c0; /读到第一个空格结束 coutc0; /输出到屏幕 coutendl; while(in0.good() /从第一个空格开始继续读文件 in0.get(ch); /使用get从文件读入 if(!ch)break; coutch; /使用cout输出 in0.close(); cout
7、endl; ifstream in1(“aaa.txt“); in1.getline(c1,30,r);/使用getline从文件头读到r并舍弃r in1.read(c0,30); /从r之后继续读文件 coutc1endlc0endl; ,程序输出结果: abcde fghij klmno pqrst uvwsyz abcde fghij klmno pq st uvwsyz,10.2.2 ostream流类,ostream类中有如下主要成员函数: flush函数 ostream 它们的功能是向流中输出几个字符,第一个参数指向待输出的字符串。,演示使用write函数和put函数和例子。 #i
8、nclude #include using namespace std; void main() char *p=“Where are you?“; ofstream myfile(“aa.txt“); myfile.write(p,5); /写入文件 cout.write(p,5); /写到屏幕 for(char ch=a;ch=z;ch+) myfile.put(ch); /写入文件 cout.put(ch); /写到屏幕 myfile.put(0); /写入文件结束符 myfile.close(); ,可以直接打开查看文件aa.txt的内容,它与屏幕上显示的内容一样,均为: Wherea
9、bcdefghijklmnopqrstuvwxyz,write函数可以将内存数据写入文件。它的第1个参数是char型指针,第2个参数是所要写的字节数。当遇到空字符时并不停止,而且当它遇到代码10时,还会自动扩充为回车换行符。这个函数可以二进制方式写入数据,这时的第1参数需要用char*作强制转换。 #include #include using namespace std; void main() int a5=1,2,3,4,5; char *p=“Where are you?“; ofstream tfile1(“aaa.txt“); /建立文本文件 tfile1.write(p,strl
10、en(p); /写入文本文件 ofstream tfile2(“aaa.dat“,ios:binary);/建立二进制文件 tfile2.write(char*)a,sizeof a);/数组名即首地址,char*强制转换 tfile1.close(); tfile2.close(); ,输入主要由右移操作符 来支持,例如在下面的程序中从标准输入读入一个int型的值序列并把它放在一个vector 中 #include #include using namespace std; void main() vector ivec; int ival; while ( cin ival ) ivec.
11、push_back( ival ); / . 子表达式 cin ival 从标准输入读入一个整数值,如果成功,则把该值拷贝到ival 中.这个子表达式的结果是左边的istream 对象在这种情况下,即cin 自己.,10.2.3 输入运算符,表达式 while ( cin ival ) 从标准输入读入一个序列,直到cin 为false 为止.有两种情况会使一个istream 对象被计算为false: 1、 读到文件结束(在这种情况下,我们已经正确地读完文件中所有的值) 2、遇到一个无效的值,比如3.14159( 小数点是非法的)、1e-1 字符(文字e 是非法的)或者一般的任意字符串文字。 在
12、读入一个无效值的情况下,istream 对象被放置到一种错误的状态中,并且对于值的所有读入动作都将停止。,10.2.3 输入运算符,10.2.3 输入运算符,运算符输入预定义类型数据时的注意事项 : 在缺省情况下,运算符跳过空白符,然后读入与 输入变量类型相对应的值。 当输入字符串(即,类型为char*的变量)时,运算符 “”的作用是跳过空白,读 入以下的非空白字符,直到 遇到另一个空白字符为止,并在串尾放一个字符“0”。 不同类型的变量一起输入时,系统除了检查是否含有 空白符之外,还完成输入数据与变量类型的匹配。 输入运算符“” 采用左结合方式工作,并返回它的左 操作数,因此,可以把多个输入
13、操作组合到一个语句中。,最常用的输出方法是在cout 上应用左移操作符( using namespace std; void main() cout “gossipaceous Anna Livian“; 在用户终端上将输出以下内容: gossipaceous Anna Livia 输出操作符可以接受任何内置数据类型的实参,包括const char* ,以及标准库string 和complex 类类型。任何表达式包括函数调用,都可以是输出操作符的实参,只要它的计算结果是一个能被输出操作符实例接受的数据类型即可。例如:,10.2.4 输出运算符,#include #include using n
14、amespace std; void main() cout “The length of ulysses is:t“; cout strlen( “ulysses“ ); cout n; cout “The size of ulysses is:t“; cout sizeof( “ulysses“ ); cout endl; 在用户终端上输出如下内容: The length of “ulysses“ is: 7 The size of “ulysses“ is: 8 endl 是一个ostream 操纵符,它把一个换行符插入到输出流中,然后 再刷新ostream 缓冲区.,10.2.4 输出
15、运算符,下面的程序展示了一种令人迷惑的现象,我们的目的是输出pstr 所包含的地址值: #include using namespace std; const char *str = “vermeer“; void main() const char *pstr = str; cout (const_cast(pstr) 编译并运行程序得到了我们所期望的输出: The address of pstr is: 0x116e8,10.2.4 输出运算符,下面是另一个令人迷惑的现象,我们的目的是显示两个值中的较大值: #include using namespace std; inline void
16、 max_out( int val1, int val2 ) cout val2 ) ? val1 : val2; void main() int ix = 10, jx = 20; cout “The larger of “ ix; cout “, “ jx “ is “; max_out( ix, jx ); cout endl; 但是在编译并运行程序后却生成了如下不正确的结果: The larger of 10, 20 is 0,10.2.4 输出运算符,问题在于输出操作符的优先级高于条件操作符,所以输出val1 和val2 比较结果的true/false 值.即表达式 cout val
17、2 ) ? val1 : val2; 被计算为 (cout val2 ) ? val1 : val2; 因为val1 不大于val2 ,所以计算结果为false ,它被输出为0. 为了改变预定义的操作符优先顺序,整个条件操作符表达式必须被放在括号中 cout val2 ? val1 : val2); 这次产生了正确的输出 The larger of 10, 20 is 20,10.2.4 输出运算符,10.2.4 输出运算符,使用输出运算符输出预定义类型数据时的注意事项。 输出运算符“”也采用左结合方式工作,并且返 回它的左操作数,因此,可以把多个输出操作组合 到一个语句中,使用起来很方便。
18、使用输出运算符“”进行输出操作时,不同类型 的数据也可以组合在一条语句中,例如上面的例子 中就是把整型变量和双精度型变量的输出放在同一 条语句中。 重载并不能改变运算符的优先级,因此,必须特 别注意表达式的求值顺序。,10.3 格式控制,C+语言提供了两种格式控制方法:一种方 法是使用ios类中有关格式控制的成员函数;另一 种方法是使用称为操纵符的特殊类型的函数。,10.3.1 用ios类成员函数控制格式,用成员函数操作状态标志 设置状态标志。 ios中定义了用于设置状态标志的成员函数setf,它的原型为: long ios:setf(long flags); 清除状态标志。 取状态标志。 下
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第十 IO
链接地址:https://www.31doc.com/p-3130402.html