第十一章流类库和翰入/输出 本章的目的就是就是介绍在C++语言环境下,数据的输入和 输出机制。 在C+十语言中,数据的输入和输出(简写为I/0)包括对 标准输入设备(键盘)和标准输出设备(显示器)(标准 I/o)、对在外存磁盘上的文件(文件I/O)进行输入输出这两 个方面。 C++中把数据之间的传输操作称作流,流是一种抽象的概 念,负责在数据的产生者和数据的使用者之间建立联系,并管理 数据的流动,流既可以表示数据从内存传送到某个载体或设备中, 即输出流;也可以表示数据从某个载体或设备传送到内存缓冲区 变量中,即输入流。 C++语言中并没有输入/输出语句,而是在标准库里包含 了一个I/0流类库,它与标准模板库同为C++标准库中最重要 的组成部分
第十一章 流类库和输入/输出 本章的目的就是就是介绍在C++语言环境下,数据的输入和 输出机制。 在C++语言中,数据的输入和输出(简写为I/O)包括对 标准输入设备(键盘)和标准输出设备(显示器)(标准 I/O )、对在外存磁盘上的文件(文件I/O)进行输入输出这两 个方面。 C++中把数据之间的传输操作称作流,流是一种抽象的概 念,负责在数据的产生者和数据的使用者之间建立联系,并管理 数据的流动,流既可以表示数据从内存传送到某个载体或设备中, 即输出流;也可以表示数据从某个载体或设备传送到内存缓冲区 变量中,即输入流。 C++语言中并没有输入/输出语句,而是在标准库里包含 了一个I/O流类库,它与标准模板库同为C++标准库中最重要 的组成部分
第十一章流类库和输入/输出 111C++的基本流类体系 114文件的输入与输出 112标准流对象 115检测流错误操作 113流的格式化控制 116定向打印输出
第十一章 流类库和输入/输出 11.1 C++的基本流类体系 11.3 流的格式化控制 11.2 标准流对象 11.4 文件的输入与输出 11.5 检测流错误操作 11.6 定向打印输出
11.1C++的基冲漉类体黍國圓 C++为实现数据的输入和输出定义了一个庞大的类库 它包括的类主要有: streambuf类:用以管理流的缓冲区。 ios类:它为根基类,提供格式、错误检测和状态信息。 ostream类:用来创建输出流。 stream类:用来创建输入流。 iostream类:用来创建输入输出流。 ifstream, ofstream, istream类:用于文件 stream_ withassign类:标准输入流类。 ostream withassign类:标准输出流类。 其中ios为根基类,是 istream和 ostream的虚基类,而 iostream是 istream和 ostream的公共派生类。 使用标准的输入输出流类必须包含头文件 iostream. h 使用文件的输入输出流类必须包含头文件 fstream, h
11.1 C++的基本流类体系 C++为实现数据的输入和输出定义了一个庞大的类库, 它包括的类主要有: streambuf类:用以管理流的缓冲区。 ios类:它为根基类,提供格式、错误检测和状态信息。 ostream类:用来创建输出流。 istream类:用来创建输入流。 iostream类:用来创建输入输出流。 ifstream,ofstream,fstream类:用于文件。 istream_withassign 类:标准输入流类。 ostream_withassign 类:标准输出流类。 其中ios为根基类,是istream和ostream的虚基类,而 iostream是istream和ostream的公共派生类。 使用标准的输入输出流类必须包含头文件 iostream.h 使用文件的输入输出流类必须包含头文件 fstream.h
11.1C++的基哔类体票 整个流类体系是一个派生类层次体系。它的结构如下: 指针 lOS streambuf istream ostream istream withassign iostream ostream withassign iostream withassign 输入输出流类派生体系
11.1 C++的基本流类体系 整个流类体系是一个派生类层次体系。它的结构如下: 输入/输出流类派生体系 ios streambuf istream ostream istream_withassign iostream ostream_withassign iostream_withassign 指针
112标准流对象 C++不仅定义有现成的I/类库供用户使用,而且还为 用户进行标准I/O操作预定义了四个类对象,它们分别是cn, cout,cer和clog,定义如下: extern istream withassign cin; extern ostream withassign couti extern ostream_ withassign cerr; extern ostream withassign clog cn为 istream_ withassign流或标准输入流的对象,后三个 为 ostream_ withassign流类的对象,cout代表标准输出设 备显示器,为标准输出流,cer和cog含义相同,均代表错 误信息输出设备显示器。因此当进行键盘输入时使用cin流, 当进行显示器输出时使用cout流,当进行错误信息输出时使 用cerr(无缓冲)或cog(有缓冲)
11.2 标准流对象 C++不仅定义有现成的I/O类库供用户使用,而且还为 用户进行标准I/O操作预定义了四个类对象,它们分别是cin, cout,cerr和clog,定义如下: extern istream_withassign cin; extern ostream_withassign cout; extern ostream_withassign cerr; extern ostream_withassign clog; cin为istream_withassign流或标准输入流的对象,后三个 为ostream_withassign流类的对象,cout代表标准输出设 备显示器,为标准输出流,cerr和clog含义相同,均代表错 误信息输出设备显示器。因此当进行键盘输入时使用cin流, 当进行显示器输出时使用cout流,当进行错误信息输出时使 用cerr(无缓冲)或clog(有缓冲)
112标准跪对象cin 类 istream的定义 class istream: virtual public ios t public: istream(streambuf )i istream get(signed char *, int, char = \n; istream get(signed char x, int, char = \ni istream get(signed char &i istream get(unsigned char &i int geto; istream getline(signed char int, char =nD; istream getline unsigned char int, char =\n; istream read(signed char * int, )i int peek istream operator>>(signed char x istream operator >>(signed char &) istream operator >>(int &i
11.2 标准流对象 cin 类istream的定义: class istream:virtual public ios { public: istream(streambuf *); istream & get(signed char *, int, char =‘\n’); istream & get(signed char *, int, char =‘\n’); istream & get(signed char &); istream & get(unsigned char &); int get(); istream & getline(signed char *, int, char =‘\n’); istream & getline(unsigned char *, int, char =‘\n’); istream & read(signed char *, int, ); …… int peek(); istream & operator >> (signed char *); istream & operator >> (signed char &); istream & operator >> (int &); …… };
112标准跪对cin C++的流通过重载运算符“>"执行输入和输出 操作。输出操作是向流中插入一个字符序列,因此,在流操作 中,将运算符“>"称为提取运算符。 在 istream输入流类中定义有对右移操作符>>重载的一组 公用成员函数,函数的具体声明格式为: istream& operator>>(简单类型标识符&); 简单类型标识符可以为char, unsigned char, short, unsigned short, int, long, unsigned long, float, double, long double,char*, unsigned char*之中的 任何一种,对于每一种类型都对应着一个右移操作符重载函数 由于右移操作符重载用于给变量输入数据的操作,所以又称为 提取操作符,即从流中提取出数据赋给变量 cin>>变量相当于 cinoperator>>(变量) cin>>k cinoperator >> (k)i 心u
11.2 标准流对象 cin C++的流通过重载运算符“>”执行输入和输出 操作。输出操作是向流中插入一个字符序列,因此,在流操作 中,将运算符“>”称为提取运算符。 在istream输入流类中定义有对右移操作符>>重载的一组 公用成员函数,函数的具体声明格式为: istream & operator >>(简单类型标识符 &); 简单类型标识符可以为char, unsigned char, short, unsigned short, int, long, unsigned long, float, double, long double, char *, unsigned char *之中的 任何一种,对于每一种类型都对应着一个右移操作符重载函数。 由于右移操作符重载用于给变量输入数据的操作,所以又称为 提取操作符,即从流中提取出数据赋给变量。 cin >> 变量 相当于 cin.operator >> (变量) cin >> k; cin.operator >> (k);
112标准跪对象cin char ca int k float fa cin >>k>>c>> fa cinoperator>>(k operator>>(k)operator>>( k)i 对象引用 另外,我们也可以直接利用 istream中的公用成员函数来进 行数据的输入,如: void maino//11-2-1.cpp d int i= 0; char buf[20]: while(i<20 &&(buf[i]cin geto!=n)i++i buf[i]=0 cout < buf < endli f// while (i<20 & cin get(buf[i])&& buf[i]!="n)i++
11.2 标准流对象 cin char c; int k; float f; cin >> k >> c >> f; cin.operator>>(k). operator>>(k).operator>>(k); 另外,我们也可以直接利用istream中的公用成员函数来进 行数据的输入,如: void main() // 11-2-1.cpp { int i = 0; char buf[20]; while(i<20 && (buf[i]=cin.get()) != ‘\n’) i ++; buf[i] = ‘\0’; cout << buf << endl; } // while(i<20 && cin.get(buf[i]) && buf[i] != ‘\n’) i ++; 对象引用
112标准流对象cin 标准设备输入,注意以下几点,可以避免错误。 1.cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取 时,是从缓冲区中拿。如果一次输入过多,会留在那儿慢慢 用,如果输入错了,必须在回车之前修改,如果回车键按下 就无法挽回了。只有把输入缓冲区中的数据取完后,才要求 输入新的数据。不可能用刷新来清除缓冲区,所以不能输错, 也不能多输! 2.输入的数据类型必须与要提取的数据类型一致,否则出错。 3.空格和回车都可以作为数据之间的分格符,所以多个数据可 以在一行输入,也可以分行输入。但如果是字符型和字符串, 则空格(ASCI码为32)无法用cin输入,字符串中也不能 有空格。回车符也无法读入。 读空格符: cin.getline( str, sIze)
11.2 标准流对象 cin 标准设备输入,注意以下几点,可以避免错误。 1. cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取 时,是从缓冲区中拿。如果一次输入过多,会留在那儿慢慢 用,如果输入错了,必须在回车之前修改,如果回车键按下 就无法挽回了。只有把输入缓冲区中的数据取完后,才要求 输入新的数据。不可能用刷新来清除缓冲区,所以不能输错, 也不能多输! 2. 输入的数据类型必须与要提取的数据类型一致,否则出错。 3. 空格和回车都可以作为数据之间的分格符,所以多个数据可 以在一行输入,也可以分行输入。但如果是字符型和字符串, 则空格(ASCII码为32)无法用cin输入,字符串中也不能 有空格。回车符也无法读入。 读空格符:cin.getline(str, SIZE);
112标准流封亲cin #include //11-2-2 cpp const int ne40 void maino i char s1[Nl, S2N] cout≤≤ Enter a String:"; cin>> s1: cout << S1:<<s1<< enda cin getline (s2, n;// cin get(s2, Ni cout <<S2=<< s2<< end; 输入: get put read write 结果是:S1=get S2= put read write
11.2 标准流对象 cin #include // 11-2-2.cpp const int N=40; void main() { char s1[N], s2[N]; cout > s1; cout << “S1=“ << s1 << endl; cin.getline(s2, N); // cin.get(s2, N); cout << “S2=“ << s2 << endl; } 输入:get put read write 结果是:S1=get S2= put read write