37
第9第 C++ 的的的 / 的的的 9.1 第第 9.2 第第第 9.3 第第第 9.4 第第第第 9.5 第第第第第第第

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

  • Upload
    ward

  • View
    109

  • Download
    0

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: 第 9 章  C++ 的输入 / 输出流

第 9 章 C++的输入 /输出流 9.1 概述

9.2 输出流 9.3 输入流

9.4 格式控制 9.5 文件的输入输出

Page 2: 第 9 章  C++ 的输入 / 输出流

9.1 概述

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

Page 3: 第 9 章  C++ 的输入 / 输出流

流操作对流的基本操作有两种,从流中获得数

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

Page 4: 第 9 章  C++ 的输入 / 输出流

输入输出流类输入输出流类负责把计算机的各种输入输出设

备,变成流的源头和目的地,能被源源不断地提取和插入数据。

streambuf 类和 ios 类分别是两个类族的顶层基类,其它流类都是由这两个类中的一个派生而来。

Page 5: 第 9 章  C++ 的输入 / 输出流

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

Page 6: 第 9 章  C++ 的输入 / 输出流

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

Page 7: 第 9 章  C++ 的输入 / 输出流

流插入运算符 cout<< 表达式 1<<……<< 表达式 n;int x=1,y=2;

float z=3.4; char c=’a’;cout<<x<<”,”<<y<<”,”<<z<<”,”<<c<<en

dl;cout<<x+y<<(x>y)<<endl;

Page 8: 第 9 章  C++ 的输入 / 输出流

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

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

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

Page 10: 第 9 章  C++ 的输入 / 输出流

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

Page 11: 第 9 章  C++ 的输入 / 输出流

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

Page 12: 第 9 章  C++ 的输入 / 输出流

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

Page 13: 第 9 章  C++ 的输入 / 输出流

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

cin.getline(a,21,’#’);

Page 14: 第 9 章  C++ 的输入 / 输出流

读取控制成员函数

函数原型 说明

int gcount(void) const 统计最近一次实际读取的字符个数

istream& ignore(int n=1,int d=EOF)

跳过并丢弃 n 个字符,直到遇见d 中的字符为止

istream& putback(char ch)

将指定字符插入到输入流的当前位置

int peek(void) 读取输入流中当前字符

Page 15: 第 9 章  C++ 的输入 / 输出流

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

Page 16: 第 9 章  C++ 的输入 / 输出流

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

Page 17: 第 9 章  C++ 的输入 / 输出流

格式控制成员函数 函数原型 说明int width(void) 读取当前设置的域宽 int width(int n) 设置当前域宽为 n ,并返回原先设置的域宽int precision(void) 读取当前设置的浮点数精度int precision(int n) 设置当前浮点数的精度为 n ,并返回原先设置的浮点数

精度char fill(void) 读取当前设置的填充字符char fill(char ch) 设置当前填充字符为 ch ,并返回原先设置的填充字符long flags(void) 读取当前设置的格式状态标志long flags(long f) 设置当前格式状态标志为 f ,并返回原先设置的格式状态

标志long setf(long f) 设置当前格式状态标志为 f ,并返回原先设置的格式状态

标志long unsetf(long

f)清除格式状态标志 f ,并返回原先设置的格式状态标志

Page 18: 第 9 章  C++ 的输入 / 输出流

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

Page 19: 第 9 章  C++ 的输入 / 输出流

格式状态标志 ios::adjustfield 标志组

ios::left 输出时左对齐 ios::right 输出时右对齐 ios::internal 符号和基数标志左对齐,

数值右对齐,中间用字符填充

Page 20: 第 9 章  C++ 的输入 / 输出流

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

Page 21: 第 9 章  C++ 的输入 / 输出流

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

Page 22: 第 9 章  C++ 的输入 / 输出流

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

Page 23: 第 9 章  C++ 的输入 / 输出流

成员函数 flags long oldf; oldf=cout.flags(ios::left|ios::hex);/* 设置输

出左对齐和以十六进制为基数的标志 */ …… cout.flags(oldf);//恢复原先的状态设置

Page 24: 第 9 章  C++ 的输入 / 输出流

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

…… cout.unsetf(ios::left);//清除左对齐标志

Page 25: 第 9 章  C++ 的输入 / 输出流

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

Page 26: 第 9 章  C++ 的输入 / 输出流

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

Page 27: 第 9 章  C++ 的输入 / 输出流

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

Page 28: 第 9 章  C++ 的输入 / 输出流

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

Page 29: 第 9 章  C++ 的输入 / 输出流

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

Page 30: 第 9 章  C++ 的输入 / 输出流

打开方式 打开方式 说明

ios::in 以读方式打开文件

ios::out 以写方式打开文件

ios::app 在文件尾部追加写入

ios::ate 打开一个已存在的文件,并将位置指针置于该文件的结尾

ios::nocreate 打开一个已存在的文件,若该文件不存在,则打开失败

ios::noreplace 打开文件时若该文件已存在,而且未设置 app 或者 ate ,则打开失败

ios::binary 以二进制方式打开文件

ios::trunc 打开文件时若已存在,清空原有内容;若文件不存在,则创建新文件

Page 31: 第 9 章  C++ 的输入 / 输出流

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

Page 32: 第 9 章  C++ 的输入 / 输出流

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

Page 33: 第 9 章  C++ 的输入 / 输出流

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

Page 34: 第 9 章  C++ 的输入 / 输出流

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

Page 35: 第 9 章  C++ 的输入 / 输出流

文件的定位和状态检测 成员函数 tellg 和 tellp 用于得到文件位置指针的当前位置,其函数原型为:

long tellg(void); long tellp(void);

Page 36: 第 9 章  C++ 的输入 / 输出流

重新定位成员函数 seekg 用于重新定位输入流文件位置指针的当前位置,其函数原型为:

istream& seekg(long pos);istream& seekg(long offset,ios::seek_dir r

pos);

Page 37: 第 9 章  C++ 的输入 / 输出流

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

说明

ios::goodbit 文件流状态良好,其它 3 个标志都不为 true

ios::eofbit 文件位置指针已到达文件的尾部

ios::failbit 文件操作失败

ios::badbit 由于内存不足等原因,出现不可恢复的错误