第14讲输入输出流.ppt
《第14讲输入输出流.ppt》由会员分享,可在线阅读,更多相关《第14讲输入输出流.ppt(72页珍藏版)》请在三一文库上搜索。
1、第十三讲 输入输出流,C+语言程序设计,主要内容,13.1 C+的输入和输出 13.2 标准输出流 13.3 标准输入流 13.4 文件操作与文件流 13.5 字符串流,以前所用到的输入和输出,都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上。 除了以终端为对象进行输入和输出外,还经常用磁盘(光盘)作为输入输出对象,磁盘文件既可以作为输入文件,也可以作为输出文件。 程序的输入指的是从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件。,13.1 C+的输入和输出 13.1.1 输入输出的含义,C+的输入与输出包括以下3方面的内容: (1) 对系统指定的标准设备
2、的输入和输出。即从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出,简称标准I/O。 (2) 以外存磁盘文件为对象进行输入和输出,即从磁盘文件输入数据,数据输出到磁盘文件。以外存文件为对象的输入输出称为文件的输入输出,简称文件I/O。 (3) 对内存中指定的空间进行输入和输出。通常指定一个字符数组作为存储空间(实际上可以利用该空间存储任何信息)。这种输入和输出称为字符串输入输出,简称串I/O。 C+采取不同的方法来实现以上3种输入输出。 为了实现数据的有效流动,C+系统提供了庞大的I/O类库,调用不同的类去实现不同的功能。,在C+的输入输出中,编译系统对数据类型进行严格的检查,凡
3、是类型不正确的数据都不可能通过编译。因此C+的I/O操作是类型安全(type safe)的。 C+的I/O操作是可扩展的,不仅可以用来输入输出标准类型的数据,也可以用于用户自定义类型的数据。C+对标准类型的数据和对用户声明类型数据的输入输出,采用同样的方法处理。 C+通过I/O类库来实现丰富的I/O功能。C+的输入输出优于C语言中的printf和scanf,但是比较复杂,要掌握许多细节。,13.1.2 C+的I/O对C的发展 类型安全和可扩展性,C+的输入输出流是指由若干字节组成的字节序列,这些字节中的数据按顺序从一个对象传送到另一对象。流表示了信息从源到目的端的流动。 在输入操作时,字节流从
4、输入设备(如键盘、磁盘)流向内存,在输出操作时,字节流从内存流向输出设备(如屏幕、打印机、磁盘等)。 流中的内容可以是ASCII字符、二进制形式的数据、图形图像、数字音频视频或其他形式的信息。 在内存中为每一个数据流开辟一个内存缓冲区,用来存放流中的数据。流是与内存缓冲区相对应的,或者说,缓冲区中的数据就是流。,13.1.3 C+的输入输出流,I/O流的结构,流类库,i/ostream,istream,ostream,ios,ios类提供关于对流状态进行设置的功能,它是一个基类,istream类提供向流中插入数据的有关操作,ostream类提供从流中提取数据的有关操作,streambuf,st
5、reambuf类是为ios类及其派生类提供对数据的缓冲支持,上面类派生定义了几个描述文件抽象的类: ifstream类:从istream类派生的,功能是对文件进行输入操作 ofstream类:从ostream类派生的,功能是对文件进行输出操作 fstream类:对文件进行插入和提取操作 filebuf类:从streambuf类派生的,作为上述类的缓冲支持,图13.2 I/O类库中还有其他类,见图13.3。,图13.3,C+编译系统提供了用于输入输出的iostream类库。在iostream类库中包含许多用于输入输出的类。 ios是抽象基类,由它派生出istream类和ostream类。istr
6、eam类支持输入操作,ostream类支持输出操作。 iostream类是从istream类和ostream类通过多重继承而派生的类。它支持输入输出双向操作,其继承层次见图13.1表示。,1. iostream类库中有关的类,头文件是程序与类库的接口,iostream类库的接口分别由不同的头文件来实现。常用的有 iostream包含了对输入输出流进行操作所需的基本信息。 fstream用于用户管理的文件的I/O操作。 strstream用于字符串流I/O。 stdiostream用于混合使用C和C+的I/O机制时。 iomanip在使用格式化I/O时应包含此头文件。,2. 常见与iostrea
7、m类库有关的头文件,3.系统定义的I/O流类对象,“”本来在C+中是被定义为左位移运算符和右位移运算符的,由于在iostream头文件中对它们进行了重载,使它们能用作标准类型数据的输入和输出运算符。 在用它们的程序中必须用#include 输出操作由重载的插入符“”实现 系统预定好了4个流类对象,供用户使用: cin:它是istream类的对象,用来处理标准输入,即键盘输入 cout:它是ostream类的对象,用来处理标准输出,即屏幕输出 cerr:它是ostream类的对象,用来处理标准出错信息,不带缓冲区的输出,即发给它的内容立即输出 clog:它是ostream类的对象,用来处理标准出
8、错信息,带缓冲区的输出,缓冲区满时被输出,如果在程序中有下面的表达式: cout”、“”运行符可以输入、输出各种类型的数据。,例13.1 有一元二次方程ax2+bx+c=0,其一般解为 x1,2=(-bb2-4ac)/2a,但若a=0,或b2-4ac #include using namespace std;,13.2 标准输出流 13.2.1 标准输入、输出流对象的使用,int main( ) float a,b,c,disc; coutabc; if (a=0) cerra is equal to zero,error!endl; /将有关出错信息插入cerr流,在屏幕输出 else if
9、 (disc=b*b-4*a*c)0) cerrdisc=b*b-4*a*c0endl; /将有关出错信息插入cerr流,在屏幕输出 else coutx1=(-b+sqrt(disc)/(2*a)endl; coutx2=(-b-sqrt(disc)/(2*a)endl; return 0; ,运行情况如下: please input a,b,c: 0 2 3 a is equal to zero,error! please input a,b,c: 5 2 3 sc=b*b-4*a*c0 please input a,b,c: 1 2.5 1.5 x1=-1 x2=-1.5,在输出数据时,
10、有时希望数据按指定的格式输出。有两种方法可以达到此目的。一种是第3章已介绍过的使用控制符的方法;第2种是使用流对象的有关成员函数。 1. 使用控制符控制输出格式 输出数据的控制符见书中P337。 应当注意,这些控制符是在头文件iomanip中定义的,因而程序中应当包含iomanip。,13.2.2 格式输出,例13.2 用控制符控制输出格式。 #include #include /不要忘记包含此头文件 using namespace std; int main() int a; couta; coutdec:decaendl; /以十进制形式输出整数 couthex:hexaendl; /以十
11、六进制形式输出整数a coutoct:setbase(8)aendl; /以八进制形式输出整数a char *pt=China; /pt指向字符串China coutsetw(10)ptendl; /指定域宽为10,输出字符串 coutsetfill(*)setw(10)ptendl; /指定域宽10,输出字符串,空白 处以*填充 double pi=22.0/7.0; /计算pi值 coutsetiosflags(ios:scientific)setprecision(8);/按指数形式输出,8位小数 coutpi=piendl; /输出pi值 coutpi=setprecision(4)p
12、iendl; /改为4位小数 coutpi=setiosflags(ios:fixed)piendl;/改为小数形式输出 return 0; ,运行结果如下: input a:34(输入a的值) dec:34 (十进制形式) hex:22 (十六进制形式) oct:42 (八进制形式) China (域宽为10) *China (域宽为10,空白处以*填充) pi=3.14285714e+00 (指数形式输出,8位小数) pi=3.1429e+00 (指数形式输出,4位小数) pi=3.143 (小数形式输出,精度仍为4),2. 用流对象的成员函数控制输出格式 除了可以用控制符来控制输出格式外
13、,还可以通过调用流对象cout中用于控制输出格式的成员函数来控制输出格式。用于控制输出格式的常用的成员函数见书中P332。 流成员函数setf和控制符setiosflags括号中的参数表示格式状态,它是通过格式标志来指定的。格式标志在类ios中被定义为枚举值。因此在引用这些格式标志时要在前面加上类名ios和域运算符“:”。格式标志见书中P333。,例13.3 用流控制成员函数输出数据。 #include using namespace std; int main( ) int a=21 cout.setf(ios:showbase);/显示基数符号(0x或0) coutdec:aendl; /
14、默认以十进制形式输出a cout.unsetf(ios:dec); /终止十进制的格式设置 cout.setf(ios:hex); /设置以十六进制输出的状态 couthex:aendl; /以十六进制形式输出a cout.unsetf(ios:hex); /终止十六进制的格式设置 cout.setf(ios:oct); /设置以八进制输出的状态 coutoct:aendl; /以八进制形式输出a cout.unseft(ios:oct); char *pt=China; /pt指向字符串China cout.width(10); /指定域宽为10 coutptendl; /输出字符串 cou
15、t.width(10); /指定域宽为10,cout.fill(*); /指定空白处以*填充 coutptendl; /输出字符串 double pi=22.0/7.0; /输出pi值 cout.setf(ios:scientific); /指定用科学记数法输出 coutpi=; /输出pi= cout.width(14); /指定域宽为14 coutpiendl; /输出pi值 cout.unsetf(ios:scientific); /终止科学记数法状态 cout.setf(ios:fixed); /指定用定点形式输出 cout.width(12); /指定域宽为12 cout.setf(
16、ios:showpos); /正数输出“+”号 cout.setf(ios:internal); /数符出现在左侧 cout.precision(6); /保留6位小数 coutpiendl; /输出pi,注意数符“+”的位置 return 0; ,运行情况如下: dec:21(十进制形式) hex:0x15 (十六进制形式,以0x开头) oct:025 (八进制形式,以0开头) China (域宽为10) *China (域宽为10,空白处以*填充) pi=*3.142857e+0 (指数形式输出,域宽14,默认6位小数) +*3.142857 (小数形式输出,精度为6,最左侧输出数符“+”
17、),输出单个字符的成员函数put。如:cout.put(a); 调用该函数的结果是在屏幕上显示一个字符a。 put函数的参数可以是字符 put函数的参数可以是字符的ASCII代码 put函数的参数也可以是一个整型表达式 如:cout.put(65+32);输出为:a(字符a的ASCII代码) 可以在一个语句中连续调用put函数。 如:cout.put(71).put(79).pu(79).put(68).put(n); 在屏幕上显示GOOD。,13.2.3 用流成员函数put输出字符,例13.4 有一个字符串BASIC,要求把它们按相反的顺序输出。 #include using namespa
18、ce std; int main( ) char *a=BASIC;/字符指针指向B for(int i=4;i=0;i-) cout.put(*(a+i); /从最后一个字符开始输出 cout.put(n); return 0; 运行时在屏幕上输出: CISAB,还可以用putchar函数输出一个字符。putchar函数是C语言中使用的,在stdio.h头文件中定义。C+保留了这个函数,在iostream头文件中定义。 例13.4也可以改用putchar函数实现。 #include /也可以用#include ,同时不要下一行 using namespace std; int main( )
19、 char *a=BASIC; for(int i=4;i=0;i-) putchar(*(a+i); putchar(n); 运行结果与前相同。,cin是istream类的对象,它从标准输入设备(键盘)获取数据,程序中的变量通过流提取符“”从流中提取数据。 注意:流提取符“”从流中提取数据时通常跳过输入流中的空格、tab键、换行符等空白字符。遇到这些字符,该行数据输入结束。即 只有在输入完数据再按回车键后,该行数据才被送入键盘缓冲区,形成输入流,提取运算符“”才能从中提取数据。,13.3 标准输入流 13.3.1 cin流,1. 用get函数读入一个字符 流成员函数get有3种形式: 无参数
20、的,有一个参数的,有3个参数的。 (1) 不带参数的get函数 其调用形式为:cin.get() 用来从指定的输入流中提取一个字符,函数的返回值就是读入的字符。若遇到输入流中的文件结束符,则函数值返回文件结束标志EOF(End Of File) 。,13.3.2 用于字符输入的流成员函数,举例有3个参数的get函数 其调用形式为 cin.get(字符数组,字符个数n,终止字符) 或 cin.get(字符指针,字符个数n,终止字符) 其作用是从输入流中读取n-1个字符,赋给指定的字符数组(或字符指针指向的数组),如果在读取n-1个字符之前遇到指定的终止字符,则提前结束读取。如果读取成功则函数返回
21、非0值(真),如失败(遇文件结束符) 则函数返回0值(假)。 #include using namespace std; int main( ) char ch20; coutenter a sentence:endl; cin.get(ch,10,n);/指定换行符为终止字符 coutchendl; return 0; ,运行情况如下: enter a sentence: I study C+ very hard. I study get函数中第3个参数可以省写,此时默认为n。 终止字符也可以用其他字符。 2. 用成员函数getline函数读入一行字符 getline函数的作用是从输入流中读
22、取一行字符,其用法与带3个参数的get函数类似。即 cin.getline(字符数组(或字符指针),字符个数n,终止标志字符),例13.7 用getline函数读入一行字符。 #include using namespace std; int main( ) char ch20; coutch; coutThe string read with cin is:chendl; cin.getline(ch,20,/);/读19个字符或遇/结束 coutThe second part is:chendl; cin.getline(ch,20); /读19个字符或遇/n结束 coutThe thir
23、d part is:chendl; return 0; 程序运行情况如下: enter a sentence: I like C+./I study C+./I am happy. The string read with cin is:I The second part is: like C+. The third part is:I study C+./I am h,除了以上介绍的用于读取数据的成员函数外,istream类还有其他在输入数据时用得着的一些成员函数。常用的有以下几种: 1. eof 函数 eof是end of file的缩写,表示“文件结束”。从输入流读取数据,如果到达文件末
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 14 输入输出
链接地址:https://www.31doc.com/p-2251143.html