1 / 37

第 9 章 C++ 的输入 / 输出流

第 9 章 C++ 的输入 / 输出流. 9.1 概述 9.2 输出流 9.3 输入流 9.4 格式控制 9.5 文件的输入输出. 9.1 概述. C++ 用流( stream )的概念描述数据的输入输出,流是计算机中的数据从源头移动到目的地的这种过程的抽象。 流具有很强的方向性,与输入设备相联系的流称为输入流,与输出设备相联系的流称为输出流,与输入输出设备相联系的流称为输入输出流。. 流操作.

ward
Download Presentation

第 9 章 C++ 的输入 / 输出流

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第9章 C++的输入/输出流 9.1 概述 9.2 输出流 9.3 输入流 9.4 格式控制 9.5 文件的输入输出

  2. 9.1 概述 • C++用流(stream)的概念描述数据的输入输出,流是计算机中的数据从源头移动到目的地的这种过程的抽象。 • 流具有很强的方向性,与输入设备相联系的流称为输入流,与输出设备相联系的流称为输出流,与输入输出设备相联系的流称为输入输出流。

  3. 流操作 对流的基本操作有两种,从流中获得数据称为提取操作,向流中添加数据称为插入操作。C++语言用流对象来管理流,流对象一般都与某种设备相联系,程序员通过操纵流对象,达到控制输入输出的目的。

  4. 输入输出流类 输入输出流类负责把计算机的各种输入输出设备,变成流的源头和目的地,能被源源不断地提取和插入数据。 streambuf类和ios类分别是两个类族的顶层基类,其它流类都是由这两个类中的一个派生而来。

  5. 标准流对象 • 为便于程序员在程序中实现常用的输入输出功能,C++定义了4个标准的流对象,分别是cin、cout、cerr和clog。cin对象负责标准输入,即从键盘输入数据;cout对象负责标准输出,即向显示器输出数据。cerr对象和clog对象负责标准错误输出,其中cerr对象无缓冲区而clog对象则有。 • 用于流提取的运算符是>>,用于流插入的运算符是<<,它们均从移位运算符重载而来。

  6. 9.2 输出流 • ostream类提供了数据流输出的功能,其流对象是流的目的地。在程序里可以将数据不断地插入流中,送至这些ostream流对象。 • 输出时使用的ostream流对象通常是cout,有3种基本操作方式。第1种是用流插入运算符,输出基本类型的数据;第2种是用成员函数put,输出一个字符;第3种是用成员函数write,输出一个字符串。

  7. 流插入运算符 • 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;

  8. 成员函数put • ostream& put(char c); • char c=’a’; • cout.put(c);//输出c的值即字母a • cout.put(c).put(‘b’).put(‘Q’);

  9. 成员函数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;

  10. 9.3 输入流 • istream类提供了数据流输入的功能,在程序里可以不断地从流对象中提取数据,存入相应的变量中。 • 输入时使用的istream流对象通常是cin,有4种基本操作方式。第1种是用流提取运算符,读入基本类型的数据;第2种是用成员函数get,读入一个字符或者字符串;第3种是用成员函数getline,读入一个字符串;第4种是用成员函数read,读入一串指定数量的字符。

  11. 流提取运算符 • cin>>变量1>>变量2>>……>>变量n; • 使用流提取运算符输入多个数据时,应该用空格符或者回车符进行分隔。默认情况下,系统会自动跳过输入流中的空格符、tab符以及回车符等空白字符。

  12. 成员函数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,’#’);

  13. 成员函数getline • istream& getline(char *s,int n,char ch=’\n’); • char a[80]; cin.getline(a,21,’#’);

  14. 读取控制成员函数

  15. 成员函数read • istream& read(char *s,int n); • read函数的功能是从输入流中顺序读取n个字符,并存入到s所指向的字符数组中。它与get函数、getline函数的区别是,不在读取的这些字符的尾部添加一个空字符(’\0’)。

  16. 9.4 格式控制 • 在实践应用中经常需要对输入输出的格式进行控制,例如设置域宽和精度、设置或者清除格式状态标志、设置填充字符、设置数据对齐方式,以及在输出流中插入空字符或者换行符等等。 • C++提供了两种用于格式控制的方法,一种是调用ios类的格式控制成员函数,另一种是使用流操纵符。

  17. 格式控制成员函数

  18. 案例 #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); }

  19. 格式状态标志 • ios::adjustfield标志组 ios::left 输出时左对齐 ios::right 输出时右对齐 ios::internal 符号和基数标志左对齐,数值右对齐,中间用字符填充

  20. ios::basefield标志组 • ios::dec 以十进制为基数输出 • ios::oct 以八进制为基数输出 • ios::hex 以十六进制为基数输出

  21. ios::floatfield标志组 • ios::fixed 以定点形式输出浮点数 • ios::scientific 以指数形式输出浮点数

  22. 其它标志 • ios::skipws 输入时跳过空白符 • ios::showbase 输出时带有基数标志,八进制数有前导0,十六进制数有前导0x • ios::showpoint 输出浮点数时带有小数点 • ios::showpos 输出十进制正数时有前导+ • ios::uppercase 将十六进制数和以指数形式表示的数中的字母转换为大写形式 • ios::boolalpha 以文本的形式输出布尔数据(true、false)

  23. 成员函数flags long oldf; oldf=cout.flags(ios::left|ios::hex);/*设置输出左对齐和以十六进制为基数的标志*/ …… cout.flags(oldf);//恢复原先的状态设置

  24. setf函数 • setf函数和unsetf函数通常配合使用,用来完成格式状态标志的设置和清除。 • cout.setf(ios::left);//设置输出左对齐标志 …… cout.unsetf(ios::left);//清除左对齐标志

  25. 操纵符 • 操纵符(manipulator)又称为流操作算子,是一种特殊的函数。由于操纵符返回流对象的引用,因此可以连续地使用,并直接插入到流中,较为方便地控制流中数据的输入输出格式。

  26. 案例 #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); }

  27. 自定义操纵符 ostream& pxy(ostream& out) { out.flags(ios::left); out<<setw(3); return(out); } cout<<"x="<<pxy<<p.x<<"y="<<pxy<<p.y;

  28. 9.5 文件的输入输出 • C++提供文件流类来处理文件的输入输出,分别是ifstream类、ofstream类和fstream类。 • 文件流对象控制输入输出的方式,与cin对象和cout对象非常相似,而且已经学过的输入输出成员函数、格式控制成员函数以及操纵符,基本上都可以适用于文件流对象。

  29. 文件打开与关闭 • 对文件能够进行哪些操作,这主要取决于两个因素。第一个因素是文件所关联的文件流对象,ofstream流对象能够进行文件输出操作(即写操作),ifstream流对象能够进行文件输入操作(即读操作),fstream流对象既能够进行文件输出操作,也能够进行文件输入操作。

  30. 打开方式

  31. 文件打开1 • C++文件打开的方法有两种,第一种是在创建文件流对象的同时,立即打开相关联的文件。具体实现过程就是向文件流对象的构造函数,传送文件名和打开方式等参数。 • istream file1(“a.txt”,ios::in); • ostream file2(“b.txt”,ios::out|ios::binary);

  32. 文件打开2 • 第二种方法是先创建文件流对象,再调用成员函数open,并传给它文件名和打开方式等参数,打开相关联的文件。 • istream file1; • file1.open(“a.txt”,ios::in); • ostream file2; • file2.open(“b.txt”,ios::out|ios::binary);

  33. 文件打开测试 istream file1; file1.open(“a.txt”,ios::in); if(!file1) { cerr<<”文件打开失败!”<<endl; …… }

  34. 文件的顺序读写 • 所谓顺序读写,就是文件打开之后从头开始,顺序地读写文件中的数据。 • 以文件流对象的形式来处理文件的输入输出是非常便利的,文件流对象与文件建立关联之后,就可以象cin和cout那样控制数据流,前面介绍的几种输入输出方法都可以用来实现文件的读写操作。

  35. 文件的定位和状态检测 • 成员函数tellg和tellp用于得到文件位置指针的当前位置,其函数原型为: long tellg(void); long tellp(void);

  36. 重新定位 • 成员函数seekg用于重新定位输入流文件位置指针的当前位置,其函数原型为: istream& seekg(long pos); istream& seekg(long offset,ios::seek_dir rpos);

  37. 文件流输入输出状态标志

More Related