Chapter07-C的输入和输出.ppt_第1页
Chapter07-C的输入和输出.ppt_第2页
Chapter07-C的输入和输出.ppt_第3页
Chapter07-C的输入和输出.ppt_第4页
Chapter07-C的输入和输出.ppt_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章 C+的输入和输出,内容提要,C+为何建立自己的输入输出系统 C+的流库及其基本结构 预定义类型的输入输出 无格式输入输出 格式化输入输出 用户自定义类型的输入输出 重载输出运算符“” 文件的输入输出,7.1 C+为何建立自己的输入输出系统,C+的输入输出系统比C语言更安全、更可靠 C语言的编译系统不对数据类型的合法性进行检查 用C+的输入输出系统进行操作是类型安全的 C+中需要定义众多的用户自定义类型 用户自定义类型 结构体、类等 C语言无法对这些数据进行输入输出操作 C语言中的scanf和printf,7.1.1 数据类型的合法性,int i; /假定int型占两个字节 float f; /假定float型占四个字节 scanf(“%d”,i); /错误,漏 /错误,输出f变量中前两个字节的内容,7.1.2 C+的类, 对上述类型,在C语言中下面的语句不能接受: printf(% my_class,obj);,class my_class int i; float f; char *str; obj;,7.1.3 C+的输入输出系统,C+的流类比C的输入输出函数具有更大的优越性 它是类型安全的 防止格式控制符与输出数据的类型不一致 可以重载运算符“” 用于用户自定义类型的输入和输出 书写形式简单清晰 使得程序代码具有更好的可读性,7.2 C+的流库及其基本结构,C+的流 在自然界中,流是气体或液体运动的一种状态 在C+中,“流” 是数据从一个源流到一个目的的抽象 负责在数据的生产者和消费者之间建立联系 并管理数据的流动 “流”是指数据传递的操作与管理 C+流类库 C+的输入输出是以字节流的形式实现的 字节流:ASC字符、二进制数据、图形图像、音频视频等 文件流和字符串流:有序的字节流 I/O类库 流类:I/O类库中包含许多用于输入输出的类 流对象:用流类定义的对象,7.2.1 C+的流,在C+中,流类 是为输入输出提供的一组类 它们都放在流库中 流总是与某一设备相联系 例如:键盘、屏幕或硬盘等 使用流类中定义的方法,完成对这些设备的I/O操作 流具有方向性 输入流 与输入设备(如键盘)相联系的流 输出流 与输出设备(如屏幕)相联系的流 输入输出流 与输入输出设备(如磁盘)相联系的流,7.2.2 流对象,C+中包含几个预定义的流对象 标准输入流 cin 与标准输入设备相关联 标准输出流 cout 与标准输出设备相关联 非缓冲型的标准出错流 cerr 与标准错误输出设备相关联(非缓冲方式) 缓冲型的标准出错流 clog 与标准错误输出设备相关联(缓冲方式) 在缺省情况下,指定的标准输出设备是屏幕,标准输入设备是键盘,7.2.3 流类库,C+流类库具有两个平行的基类 streambuf类 为输入输出操作在物理设备一方的接口 负责低层操作 ios类 为输入输出操作在用户一方的接口 负责高层操作 所有其他的流类都是从它们直接或间接地派生出来的,7.3 预定义类型的输入输出,无格式输入输出 格式化输入输出,7.3.1无格式输入输出,C+类库的输入输出 需使用两个流对象cin和cout 还要用与之相配套的输入输出运算符“”和“变量; / 输入 cout 常量或变量; / 输出,输入运算符“”,也称提取运算符 它是一个双目运算符,有两个操作数 左操作数是istream类的一个对象( cin ) 右操作数是系统预定义的任何数据类型的变量 例如: int x; cinx; 此时,用户从键盘输入的数值会自动地转换为变量x的类型,并存入变量x内。,输出运算符“”,也称插入运算符 它是一个双目运算符,有两个操作数 左操作数为ostream类的一个对象(cout) 右操作数为一个系统预定义类型的常量或变量 例如 cout“This is a string.n“; 完成的功能为 写字符串“This is a string. ”到流对象cout cout为标准输出流,通常为屏幕,7.3.2 格式化输入输出,C+提供了两种进行格式控制的方法 使用ios类中有关格式控制的成员函数进行格式控制 格式控制主要是通过对状态标志字的操作来完成的 在ios类的public部分定义了一个枚举,它的每个成员分别定义状态标志字的一个位,每一位都称为一个状态标志位。 使用称为操纵符的特殊类型的函数进行格式控制 C+提供的预定义操纵符,enum skipws =0x0001, / / 跳过输入中的空白,可用于输出 left =0x0002, / 左对齐输出,可用于输出 right =0x0004, / 右对齐输出,可用于输出 internal =0x0008, / 在符号位和基指示符后填入字符,用于输出 dec =0x0010, / 转换基制为十进制数,可用于输入或输出 oct =0x0020, / 转换基制为八进制数,可用于输入或输出 hex =0x0040, / 转换基制为十六进制数,用于输入或输出 showbase =0x0080, / 在输出时显示基指示符,用于输入或输出 showpoint =0x0100, / 在输出时显示小数点,可用于输出 uppercase =0x0200, /十六进制输出时,表示制式和数值的字符 /一律为大写,可用于输出 showpos =0x0400, /对正整数显示正号,可用于输出 scientific =0x0800, /用科学表示法显示浮点数,可用于输出 fixed =0x1000 , /用定点形式显示浮点数,可用于输出 unitbuf =0x2000, /在输出操作后立即刷新所有流,可用于输出 stdio =0x4000, /输出操作后刷新stdout和stderr,用于输出 ;,ios类的状态标志字,ios类的状态标志位,这些枚举元素的值有一个共同的特点 分别使二进制表示的状态标志字的不同位为“1” 如: skipws 0x0001 0000 0000 0000 0001 left 0x0002 0000 0000 0000 0010 right 0x0004 0000 0000 0000 0100,表7-1 控制输入输出格式的成员函数,第一种格式控制方法,例7.1 成员函数进行格式控制,#include main() cout“x_width=“cout.width()endl; cout“x_fill=“cout.fill()endl; cout“x_precision=“cout.precision()endl; cout123“ “123.45678endl; cout“_n“; cout“* x_width=10,x_fill=, x_precision=4 *n“; cout.width(10); cout.precision(4); cout123“ “123.45678“ “234.567endl; cout“x_width=“cout.width()endl; cout“x_fill=“cout.fill()endl; cout“x_precision=“cout.precision()endl; cout“_n“; cout“* x_width=10,x_fill= ,x_width=0 x_fill= x_precision=0 123 123.45678 - * x_width=10, x_fill= , x_precision=4 * 123 123.4568 234.567 x_width=0 x_fill= x_precision=4 - * x_width=10, x_fill=&, x_precision=4 * &123 123.4568 123& 123.4568 x_width=0 x_fill=& x_precision=4,例7.1的运行结果,预定义操纵符,dec 以十进制形式输入或输出整型数,可用于输入或输出 hex 以十六进制形式输入或输出整型数,可用于输入或输出 oct 以八进制形式输入或输出整型数,可用于输入或输出 ws 用于在输入时跳过前导的空白符,可用于输入 endl 插入一个换行符并刷新输出流,仅用于输出 ends 插入一个空字符0,通常用来结束一个字符串,仅用于输出 flush 刷新一个输出流,仅用于输出 setbase(int n) 设置转换基格式为为n(n的取值为0、8、10 或16), n的缺省值为0,即表示采用十进制,仅用于输出。 resetiosflags(long f) 关闭由参数f指定的格式标志,用于输入或输出 setiosflags(long f) 设置由参数f指定的格式标志,用于输入或输出 setfill(int ch) 设置ch为填充字符,缺省时为空格,可用于输入或输出 setprecision(int n) 设置小数部分的位数,可用于输入或输出 setw(int n) 设置域宽为n,可用于输入或输出,例7.2 操纵符的使用,#include #include main() cout setw(10) 123567endl ; / cout 123 setiosflags(ios:scientific) setw(20) 123.456789endl; / cout123setw(10)hex123endl; / cout123setw(10)oct123endl; / cout123setw(10)dec123endl; / cout resetiosflags(ios:scientific) setprecision(4) 123.456789endl; / coutsetiosflags(ios:left)setfill(#)setw(8) 123endl; / coutresetiosflags(ios:left)setfill($)setw(8) 456endl; / return 0; ,例7.2的运行结果,123567 123 1.234567e+02 123 7b 7b 173 173 123 123.4568 123# $456 ,用户自定义的操纵符函数,若为输出流定义操纵符函数,则定义形式如下: ostream ,若为输入流定义操纵符函数,则定义形式如下: istream ,例7.3 为输出流定义操纵符函数,#include #include ostream ,例7.4 为输入流定义操纵符函数,#include #include istream ,7.4 用户自定义类型的输入输出,重载输出运算符“”,7.4.1 重载输出运算符“”,定义输出运算符“”重载函数的一般格式如下: ostream ,7.4.2 重载输入运算符“”,定义输入运算符“”重载函数的一般格式: istream ,#include class coord int x,y; public: coord(int i=0,int j=0) x=i; y=j; friend ostream ,例7.5 输出运算符“”重载,例7.6-1 输入运算符“”重载,#include class three_d public: three_d(int a,int b,int c) x=a; y=b; z=c; friend ostream,例7.6-2 输入运算符“”重载,ostream ,例7.6-3 输入运算符“”重载,main() three_d obj(10,20,30); / 定义类three_d的对象obj coutobj; / 输入对象obj的各成员值,将原值覆盖 coutobj; / 输出对象obj的成员值(新值) return 0; ,7.5 文件的输入输出,文件的打开与关闭 文件的读写,7.5.1 文件的打开与关闭,文件的打开 为了对一个文件进行读写操作,应先“打开”该文件 打开一个文件,就是将这个文件与一个流建立关联 文件的关闭 在使用结束后,则应“关闭”文件 关闭一个文件,就是取消文件与流的关联 所谓关闭,实际上就是使打开的文件与流“脱钩” 关闭文件可使用close()函数完成 close()函数是流类中的成员函数 close()函数不带参数,不返回值。 例如: out.close(); 将关闭与流out相联接的文件,文件的输入输出,要执行文件的输入输出,须做三件事 在程序中包含头文件fstream.h 建立流 其过程就是定义流类的对象 例如: ifstream in; ofstream out; fstream both; 分别定义了输入流对象in;输出流对象out,输入输出流对象both 使用open()函数打开文件 就是使某一文件与上面的某一流相联系 open()函数是上述三个流类的成员函数 open()函数原型是在fstream.h中定义的, 原型为: void open (const unsigned char*, int mode, int access= filebuf: openprot);,7.5.2 文件的读写,文本文件的读写 一旦文件打开了,从文件中读取文本数据与向文件中写入文本数据都十分容易,只需使用运算符“”就可以了,只是你必须用与文件相联接的流代替cin和cout 二进制文件的读写 用get()函数和put()函数读写二进制文件 用read()函数和write()函数读写二进制文件 检测文件结束 文件的随机读写,例7.7,把一个整数、一个浮点数和一个字符串写到磁盘文件test中,#include int main() ofstream fout(“test“); if (!fout) cout“Cannot open output filen,“; return 1; fout10“ “123.456“ This is a text file.“n“; fout.close(); return 0; ,用get()函数和put()函数读写二进制文件,get()函数有许多格式,最常用的版本原型如下: istream get()函数从相关流中只读一个字节,并把该值放入ch中并返回该流,当到达文件尾时,使该流的值为0。,put()函数的原型如下: ostream put()函数将ch写入流中并返回该流。,例7.8-1,将a 至z 的26个英文字母写入文件,而后从该文件中读出并显示出来,#include #include void test_write() ofstream fs(“d:test.dat“); int i; char c=a; for (i=0;i26;i+) fs.put(c); c+; ,例7.8-2,void test_read() ifstream fs(“d:test.dat“); char c; while(fs.get(c) coutc; void main() test_write(); test_read(); ,用read()函数和write()函数读写二进制文件,read()和write()原型如下: istream ,例7.9,用write()函数向文件test中写入整数与双精度数,#in

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论