
面向对象程序的输入输出流.ppt
43页面向对象程序的输入输出流,学习目标,理解如何使用输入/输出流 掌握格式化输入/输出 掌握如何输入/输出用户自定义类型数据 掌握文件的顺序/随机处理方式,数据的输入/输出是最重要的操作,C++的输入/输出由iostream库(iostream library)提供支持它利用多继承和虚拟继承实现了面向对象类层次结构C++的输入/输出机制为内置数据类型的输入/输出提供了支持,同时也支持文件的输入/输出在此基础上,设计者可以通过扩展iostream库,为新类型的数据读写进行扩展1.C++流类库简介,C语言中的scanf和printf很灵巧高效,但不是类型安全的,而且没有扩展性scanf/printf系列函数要求把读写的变量和控制读写的格式信息分开而C++正是克服了这些缺点,使用cin/cout控制输入/输出 (1) cin,表示标准输入的istream类对象cin从终端读入数据 (2) cout,表示标准输出的ostream类对象cout向终端写数据 (3) cerr,表示标准错误输出(非缓冲方式),导出程序错误消息 (4) clog,表示标准错误输出(缓冲方式),导出程序错误消息 为了在程序中使用cin/cout,必须在程序中包含iostream库的相关头文件 #include,输入/输出格式定义如下 :[例9-1] 简单I/O举例。
cin>>变量名; cout<<变量名或常量;,#include int main(){int i;float f; char s[]=“Hello!“; cout>i; cerr << “test for cerr“ << endl;,clog >f; cout<<“i=“<buf){ purfile< ios类作为流类库的基类,主要派生了istream、ostream类,由这两个类又派生了很多使用的流类,除ifstream、ofstream、iostream类外,还有strstream(输入/输出串流类)、istrstream(输入串流类)、ostrstream(输出串流类)等2 . 输入/输出流,2.1 基本输出流 C++的ostream提供了丰富的格式化和无格式化的输出功能:用流插入符输出标准数据类型;put库成员函数输出字符;以八进制、十进制、十六进制输出数据;以各种精确方式输出浮点型数据;以科学计数法定点输出数据;以指定宽度输出数据;在区域内用指定字符填充等 流输出可以用流插入运算符——即重载的<<(左移位运算符)来完成运算符<<左边的操作数是istream类的一个对象(如cout),右边可以是C++的合法表达式[例9-3] 用插入运算符实现流输出 using namespace std; int main() {cout<<“hello! C++\n“; //其中\n表示换行cout<<“hello! C++“< 任何表达式包括函数调用,都可以是输出操作符的实参,只要它的计算结果是一个能被输出操作符实例接受的数据类型即可[例9-4] 函数调用作输出操作符的实参 using namespace std; int main() {cout<<“hello! C++!“;cout< (2) 当输入字符串(char* 类型)时,输入运算符>>会跳过空格,读入后面的非空格符,直到遇到另外一个空格结束,并在字符串末尾自动放置字符‘\0’作为结束标志,例如: char s[20]; cin>>s; 当输入 Hello! world! 时,存储在字符串s中的值为“Hello!”,而没有后面的“wordl!”3) 数据输入时,不仅检查数据间的空格,还做类型检查、自动匹配,例如: int i; float f; cin>>i>>f; 如果输入 12.34 34.56 则存储在i、f内的数值为12和0.34,而不是12.34和34.562.3 格式化输入/输出 1.ios类成员函数控制格式 见表9-1状态标志字 (1) 设置状态标志设置状态标志可使用long ios::setf(long flags)函数,使用格式如下:stream_obj.setf(ios::enum_type); 说明:其中,stream_obj为被影响的流对象,常用的是cin和coutenum_type为表9-1中列举的值例如:cout.setf(ios::dec); 表示以十进制输出 (2) 清除状态标志清除状态标志可使用long ios::unsetf(long flags)函数。 stream_obj.unsetf(ios::enum_type); 使用方法与ios::setf( )函数相同3) 取状态标志取状态标志用flags( )函数,在ios类中重载了两个版本: long ios::flags(); long ios::flags(long flag); 前者用于返回当前状态标志字;后者将状态标志字存储在flag内2 .操纵符控制格式 见书表9-2操纵符,[例9-9] 格式控制 #include #include using namespace std; int main() {int i=123;float f=2010.0301;const char* const str=“hello! every one!“;cout<<“default width is:“< #include #include using namespace std; ostream },2.4其他的输入/输出函数 1.get( )、put( )函数get(char,2.getline( )函数使用get( )函数输入字符串时,经常忘记去掉delimiter,所以引入函数getline( ),其原型与get( )的重载版本相同: getline(char *str, streamsize size, char delimiter='\n'); 使用getline( )函数比get( )方便,它除去了delimiter,而不是将其留做下一个字符 3.write( )、read( )函数 ostream类成员函数write( )提供一种输出字符数组的方法它不是输出“直到终止字符为止”,而是输出某个长度的字符序列,包括空字符函数原型如下: write(char *str, streamsize length);,3 .用户自定义类型的输入/输出,3.1 重载输出运算符“<<” 输出运算符“<<”,又称插入运算符,定义其重载函数的格式如下:函数中第一个参数out是对ostream对象的引用,即out必须是输出流对象;第二个参数是用户自定义要输出的类对象的引用。 data1,data2,……,datan是类内要输出的数据成员 输出运算符“<<”不能作为类的成员函数,只能作为友元函数(要访问类的私有成员)来实现ostream },3.2 重载输入运算符“>>” 输入运算符“>>”,又称提取运算符,定义其重载函数的格式如下 :函数中第一个参数in是对istream对象的引用,即in必须是输入流对象;第二个参数是用户自定义要输入的类对象的引用data1, data2, …,datan是类内要输入的数据成员istream },[例9-15] 输入/出运算符重载 #include #include using namespace std; class Word{char* word;size_t iNum; public:Word(const char* const str=NULL);virtual ~Word(){if(word)delete []word;}friend ostream,Word::Word(const char* const str) {if(str!=NULL){iNum=strlen(str);word=new char[iNum+1];strcpy(word,str);} } ostream },istream },。












