370 likes | 534 Views
第 9 章 C++ 的输入 / 输出流. 9.1 概述 9.2 输出流 9.3 输入流 9.4 格式控制 9.5 文件的输入输出. 9.1 概述. C++ 用流( stream )的概念描述数据的输入输出,流是计算机中的数据从源头移动到目的地的这种过程的抽象。 流具有很强的方向性,与输入设备相联系的流称为输入流,与输出设备相联系的流称为输出流,与输入输出设备相联系的流称为输入输出流。. 流操作.
E N D
第9章 C++的输入/输出流 9.1 概述 9.2 输出流 9.3 输入流 9.4 格式控制 9.5 文件的输入输出
9.1 概述 • C++用流(stream)的概念描述数据的输入输出,流是计算机中的数据从源头移动到目的地的这种过程的抽象。 • 流具有很强的方向性,与输入设备相联系的流称为输入流,与输出设备相联系的流称为输出流,与输入输出设备相联系的流称为输入输出流。
流操作 对流的基本操作有两种,从流中获得数据称为提取操作,向流中添加数据称为插入操作。C++语言用流对象来管理流,流对象一般都与某种设备相联系,程序员通过操纵流对象,达到控制输入输出的目的。
输入输出流类 输入输出流类负责把计算机的各种输入输出设备,变成流的源头和目的地,能被源源不断地提取和插入数据。 streambuf类和ios类分别是两个类族的顶层基类,其它流类都是由这两个类中的一个派生而来。
标准流对象 • 为便于程序员在程序中实现常用的输入输出功能,C++定义了4个标准的流对象,分别是cin、cout、cerr和clog。cin对象负责标准输入,即从键盘输入数据;cout对象负责标准输出,即向显示器输出数据。cerr对象和clog对象负责标准错误输出,其中cerr对象无缓冲区而clog对象则有。 • 用于流提取的运算符是>>,用于流插入的运算符是<<,它们均从移位运算符重载而来。
9.2 输出流 • ostream类提供了数据流输出的功能,其流对象是流的目的地。在程序里可以将数据不断地插入流中,送至这些ostream流对象。 • 输出时使用的ostream流对象通常是cout,有3种基本操作方式。第1种是用流插入运算符,输出基本类型的数据;第2种是用成员函数put,输出一个字符;第3种是用成员函数write,输出一个字符串。
流插入运算符 • cout<<表达式1<<……<<表达式n; • int x=1,y=2; float z=3.4; char c=’a’; cout<<x<<”,”<<y<<”,”<<z<<”,”<<c<<endl; cout<<x+y<<(x>y)<<endl;
成员函数put • ostream& put(char c); • char c=’a’; • cout.put(c);//输出c的值即字母a • cout.put(c).put(‘b’).put(‘Q’);
成员函数write • ostream& write(const char* s,int n); • char *p=”C++”,a[20]=” language”; cout.write(p,3); cout.write(a,strlen(a));//输出数组a中的字符串 cout<<endl; cout.write(p.strlen(p)).write(a,strlen(a)); cout<<endl;
9.3 输入流 • istream类提供了数据流输入的功能,在程序里可以不断地从流对象中提取数据,存入相应的变量中。 • 输入时使用的istream流对象通常是cin,有4种基本操作方式。第1种是用流提取运算符,读入基本类型的数据;第2种是用成员函数get,读入一个字符或者字符串;第3种是用成员函数getline,读入一个字符串;第4种是用成员函数read,读入一串指定数量的字符。
流提取运算符 • cin>>变量1>>变量2>>……>>变量n; • 使用流提取运算符输入多个数据时,应该用空格符或者回车符进行分隔。默认情况下,系统会自动跳过输入流中的空格符、tab符以及回车符等空白字符。
成员函数get • int get(void); • istream& get(char& c); • istream& get(char *s,int n,char ch=’\n’); • char c1,c2,a[80]; c1=cin.get(); cin.get(c2); cin.get(a,21,’#’);
成员函数getline • istream& getline(char *s,int n,char ch=’\n’); • char a[80]; cin.getline(a,21,’#’);
成员函数read • istream& read(char *s,int n); • read函数的功能是从输入流中顺序读取n个字符,并存入到s所指向的字符数组中。它与get函数、getline函数的区别是,不在读取的这些字符的尾部添加一个空字符(’\0’)。
9.4 格式控制 • 在实践应用中经常需要对输入输出的格式进行控制,例如设置域宽和精度、设置或者清除格式状态标志、设置填充字符、设置数据对齐方式,以及在输出流中插入空字符或者换行符等等。 • C++提供了两种用于格式控制的方法,一种是调用ios类的格式控制成员函数,另一种是使用流操纵符。
案例 #include<iostream.h> int main() { int i; for(i=1;i<=4;i++) { cout.width(4-i); cout.fill(' '); if(cout.width()!=0) cout<<" "; cout.width(2*i-1); cout.fill('*'); cout<<"*"<<endl; } return(0); }
格式状态标志 • ios::adjustfield标志组 ios::left 输出时左对齐 ios::right 输出时右对齐 ios::internal 符号和基数标志左对齐,数值右对齐,中间用字符填充
ios::basefield标志组 • ios::dec 以十进制为基数输出 • ios::oct 以八进制为基数输出 • ios::hex 以十六进制为基数输出
ios::floatfield标志组 • ios::fixed 以定点形式输出浮点数 • ios::scientific 以指数形式输出浮点数
其它标志 • ios::skipws 输入时跳过空白符 • ios::showbase 输出时带有基数标志,八进制数有前导0,十六进制数有前导0x • ios::showpoint 输出浮点数时带有小数点 • ios::showpos 输出十进制正数时有前导+ • ios::uppercase 将十六进制数和以指数形式表示的数中的字母转换为大写形式 • ios::boolalpha 以文本的形式输出布尔数据(true、false)
成员函数flags long oldf; oldf=cout.flags(ios::left|ios::hex);/*设置输出左对齐和以十六进制为基数的标志*/ …… cout.flags(oldf);//恢复原先的状态设置
setf函数 • setf函数和unsetf函数通常配合使用,用来完成格式状态标志的设置和清除。 • cout.setf(ios::left);//设置输出左对齐标志 …… cout.unsetf(ios::left);//清除左对齐标志
操纵符 • 操纵符(manipulator)又称为流操作算子,是一种特殊的函数。由于操纵符返回流对象的引用,因此可以连续地使用,并直接插入到流中,较为方便地控制流中数据的输入输出格式。
案例 #include<iostream.h> #include<iomanip.h> int main() { int i; for(i=1;i<=4;i++) { cout<<setw(4-i)<<setfill(' '); if(cout.width()!=0) cout<<" "; cout<<setw(2*i-1)<<setfill('*')<<"*"<<endl; } return(0); }
自定义操纵符 ostream& pxy(ostream& out) { out.flags(ios::left); out<<setw(3); return(out); } cout<<"x="<<pxy<<p.x<<"y="<<pxy<<p.y;
9.5 文件的输入输出 • C++提供文件流类来处理文件的输入输出,分别是ifstream类、ofstream类和fstream类。 • 文件流对象控制输入输出的方式,与cin对象和cout对象非常相似,而且已经学过的输入输出成员函数、格式控制成员函数以及操纵符,基本上都可以适用于文件流对象。
文件打开与关闭 • 对文件能够进行哪些操作,这主要取决于两个因素。第一个因素是文件所关联的文件流对象,ofstream流对象能够进行文件输出操作(即写操作),ifstream流对象能够进行文件输入操作(即读操作),fstream流对象既能够进行文件输出操作,也能够进行文件输入操作。
文件打开1 • C++文件打开的方法有两种,第一种是在创建文件流对象的同时,立即打开相关联的文件。具体实现过程就是向文件流对象的构造函数,传送文件名和打开方式等参数。 • istream file1(“a.txt”,ios::in); • ostream file2(“b.txt”,ios::out|ios::binary);
文件打开2 • 第二种方法是先创建文件流对象,再调用成员函数open,并传给它文件名和打开方式等参数,打开相关联的文件。 • istream file1; • file1.open(“a.txt”,ios::in); • ostream file2; • file2.open(“b.txt”,ios::out|ios::binary);
文件打开测试 istream file1; file1.open(“a.txt”,ios::in); if(!file1) { cerr<<”文件打开失败!”<<endl; …… }
文件的顺序读写 • 所谓顺序读写,就是文件打开之后从头开始,顺序地读写文件中的数据。 • 以文件流对象的形式来处理文件的输入输出是非常便利的,文件流对象与文件建立关联之后,就可以象cin和cout那样控制数据流,前面介绍的几种输入输出方法都可以用来实现文件的读写操作。
文件的定位和状态检测 • 成员函数tellg和tellp用于得到文件位置指针的当前位置,其函数原型为: long tellg(void); long tellp(void);
重新定位 • 成员函数seekg用于重新定位输入流文件位置指针的当前位置,其函数原型为: istream& seekg(long pos); istream& seekg(long offset,ios::seek_dir rpos);