第11章 C++输入输出流与文件系统_第1页
第11章 C++输入输出流与文件系统_第2页
第11章 C++输入输出流与文件系统_第3页
第11章 C++输入输出流与文件系统_第4页
第11章 C++输入输出流与文件系统_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

1、第第1111章章 C+输入输入/输出流与文件系统输出流与文件系统 C+语语言言程程序序设设计计教教程程第第11章章C+输输入入输输出出流流1第第1111章章 C+输入输入/输出流与文件系统输出流与文件系统学习目标1. 理解C+的输入/输出流的概念;2. 熟悉I/O流的工作过程;3. 熟悉各种格式标志与各种格式控制方法;4. 分清文本文件与二进制文件的区别;5. 掌握文本文件的输入/输出的步骤与操作;6. 掌握二进制文件的输入/输出的步骤与操作;7. 会运用文件指针以及各种标志; C+语语言言程程序序设设计计教教程程第第11章章C+输输入入输输出出流流2 C+中的I/O流实际上是一个处于传输状态

2、的字节序列,这些字节序列按顺序从一个对象传送到另一个对象,在对象之间的“流动”。流流形象表示了信息从源到目的端的传送过程。 在C+程序中,流的操作包括数据的输入与输出。输入操作是字节序列从外部设备(包括键盘、磁盘、网络连接)输入到内存,是字节从设备到内存的流动。输出操作是从内存输出到外部设备(如显示器、打印机、磁盘、网络连接),是字节从内存到外部设备的流动。C+语语言言程程序序设设计计教教程程第第11章章C+输输入入输输出出流流1. I/O流的概念流的概念 basic_ios basic_istream basic_ostream basic_ifstream basic_iostream b

3、asic_ofstream basic_fstream ios_base 在C+中,数据的输入/输出是通过I/O流类库实现的。C+的I/O流类流类库库采用功能强大的类层次层次结构结构实现,它能够提供数百种与数据输入和输出相关的功能,I/O流类库中各个类模板之间的层次关系如图11-1所示 3I/O流类模板流类模板是流类库的基础,描述如下: ios类是类模板basic_ios的窄字符的实例,是所有I/O流类的基础类,描述了流的基本性质。 派生类istream与ostream从公共基类继承了一些成员,在这些继承来的数据成员中,大部分用于描述流的属性或特征,如流的格式与状态。 除了继承来的成员外,is

4、tream与ostream各自添加了合适的本地成员,并重载了适当的运算符。例如istream增加了在流中读取数据和移动数据的方法。对提取运算符进行了重载。 iostream 对istream和ostream进行了多重派生,因而它既继承了读取流操作,又继承了写入流操作。但iostream没有增加额外的数据成员,而且除了构造函数与析构函数外,没有新增其他成员函数。 ifstream与ofstream分别用于文件的输入与输出,派生于iostream的fstream用于控制文件流的输入输出。 C+语语言言程程序序设设计计教教程程第第11章章C+输输入入输输出出流流1. I/O流的概念流的概念 要从I/

5、O流中获取数据或向流中添加数据,必须使用流插入运算符流插入运算符“”。 “”本来在C+中被定义为左移位运算符和右移位运算符的,但为了I/O的需要,C+又将它们进行了重重载载,以便能用它们输入或输出各种类型的数据。4 输出流就是流向输出设备的数据信息。输出流对象是数据信息流向的目标。 在C+中,最重要的三个输出流是ostream,fostream和ostrstream。ostream类可以提供无格式化输出和格式化输出。 例如:用插入运算符输出标准类型数据;用put成员函数输出字符;用write成员函数实现无格式输出。 最常用的输出方法是在cout上用插入运算符插入运算符,插入运算符可以接受任何标

6、准类型的实参,包括const char *、标准库string、complex等类型。实参可以是任何表达式包括函数调用,只要其结果是能被插入运算符能接受的数据类型即可。2. 输出流输出流 C+语语言言程程序序设设计计教教程程第第11章章C+输输入入输输出出流流5 2.链表类模板链表类模板123456789101112131415161717181920212324252627/* 程序文件名: p11_1.cpp * 功能:演示的功能 * */# include # include # include using namespace std;int main() char *s1=a c st

7、ring; string s2(a c+ string); complex c (3.14159,-1.234); int i(10); int *pi=&i; couts1endl s2endl; coutcendl; couti+ti+ti+endl; cout&i:&itpi:piendl; cout&s1:&s1ts1:const_cast(s1)endl; / s1:(void *)s1endl; return 0; 运行结果运行结果: :a c stringa c+ string(3.14159,-1.234)12 11 10&i:0

8、012FF4C pi:0012FF4C&s1:0012FF70 s1:00473040 C+语语言言程程序序设设计计教教程程第第11章章C+输输入入输输出出流流6 2.链表类模板链表类模板123456789101112131415/* 程序文件名: p11_2.cpp *功能:演示的优先级 */# include using namespace std;int main() int val1(10),val2(20);coutthe larger of val1,val2 is:;cout val2) ? val1 : val2; / cout10endl; 错误 return 0;

9、运行结果运行结果: :the larger of 10, 20 is 0 C+语语言言程程序序设设计计教教程程第第11章章C+输输入入输输出出流流7 格式标志格式标志是一组用于设置I/O流格式状态字的一个数,这些格式标志属于ios类。 C+语语言言程程序序设设计计教教程程第第11章章C+输输入入输输出出流流=3. 流的格式控制流的格式控制 表11-2 I/O流格式标志功能表 表中带*号的表示默认设置,|为或运算。分 类标 志 符功 能进制*ios:dec指定整数以十进制显示ios:oct指定整数以八进制显示ios:hex指定整数以十六进制显示对齐ios:left在域中左对齐,填充字符加到右边*

10、ios:right在域中右对齐,填充字符加到左边ios:internal数字的符号在域中左对齐,数字在域中右对齐,填充字符加到中间浮点数*ios:fixed以小数形式显示浮点数, 默认小数部分为6位(包括小数点)ios:scientific以科学计数法形式显示浮点数空格*ios:skipws忽略输入流的空格正号ios:showpos在正数前显示+号小数点ios:showpoint不管浮点数小数部分是否为0,总是显示小数点进制基数ios:showbase显示进制基数(前缀),八进制为0,十六进制为0 x或0X字母大写ios:uppercase十六进制数中字母大写显示,科学记数法中e显示成大写E布

11、尔值ios:boolalpha分别以true和false字符串形式表示真与假流刷新ios:unitbuf输出操作后刷新流进制组合ios:basefielddec | hex | oct对齐组合ios:adjustfieldinternal | left | right浮点组合ios:floatfieldfixed | scientificC+语语言言程程序序设设计计教教程程第第11章章C+输输入入输输出出流流8 每一个输入/输出流对象都维护一个格式状态字格式状态字,用它表示流对象当前的格式状态并控制流的格式,例如整型值的进制基数或浮点数的精度。C+提供了多种格式控制的方法,如使用操纵符修改对象

12、的格式状态字来控制流的格式、运用成员函数。3. 流的格式控制流的格式控制 表表11-3 格式状态字设置函数格式状态字设置函数函数函数功能功能long flags() const返回流的当前格式状态字long flags( long lFlags )设置流的格式位IFlags,返回以前的格式long setf( long lFlags )设置流的格式位IFlags,返回以前的格式long setf( long lFlags, long lMask )清除IMask,设置IFlags, 返回以前的格式long unsetf( long lFlags )清除IMask 其中, IFlags与IMas

13、k 可以是单个格式标志,也可以是与运算& 和或运算|将格式标志连接的表达式,还可以是一个长整型数。C+语语言言程程序序设设计计教教程程第第11章章C+输输入入输输出出流流9 2.链表类模板链表类模板123456789101112131415161718192021/* 程序名:p11_3.cpp *功能: 揭开格式标志的秘密 */# include using namespace std;struct fmtflags long flag; char flagname12; flags18=ios:hex,hex,ios:dec,dec,ios:oct,oct,ios:basefiel

14、d,basefield,ios:internal,internal,ios:left,left,ios:right,right,ios:adjustfield,adjustfield, ios:fixed,fixed,ios:scientific,scientific,C+语语言言程程序序设设计计教教程程第第11章章C+输输入入输输出出流流10 2.链表类模板链表类模板222324252627282930313233343536373839 ios:basefield,basefield,ios:showbase,showbase,ios:showpoint,showpoint, ios:sh

15、owpos,showpos,ios:skipws,skipws,ios:uppercase,uppercase,ios:boolalpha,boolalpha,ios:unitbuf,unitbuf;int main() long IFlags; IFlags=cout.setf(0,cout.flags(); cout.setf(ios:hex,ios:basefield); coutDefault flag is:IFlagsendl; for(int i=0;i18;i+) coutflagsi.flagtflagsi.flagnameendl; return 0; 运行结果运行结果:

16、:Default flag is:201800hex200dec400octe00basefield100internal40left80right1c0adjustfield2000fixed1000scientifice00basefield8showbase10showpoint20showpos1skipws4uppercase4000boolalpha2unitbuf C+语语言言程程序序设设计计教教程程第第11章章C+输输入入输输出出流流11 C+还提供了许多流操纵符,用于执行格式化的输入/输出操作,这些操纵符可以直接用在流中。4. 格式操纵符格式操纵符 表表11-4 格式操纵符格

17、式操纵符分类分类操纵符操纵符功能功能进制*dec指定整数以十进制显示oct指定整数以八进制显示hex指定整数以十六进制显示setbase(n)设定以n进制显示,n为8,10,16对齐left在域中左对齐,填充字符加到右边*right在域中右对齐,填充字符加到左边internal数字的符号在域中左对齐,数字在域中右对齐,填充字符加到中间浮点数显示*fixed以小数形式显示浮点数, 默认小数部分为6位(包括小数点)scientific以科学计数法形式显示浮点数空格*skipws忽略输入流的空格noskipws清除skipws,恢复输入流的空格正号showpos*noshowpos在正数前显示+号清

18、除showpos, 在正数前不显示+号showpos*noshowpos在正数前显示+号清除showpos, 在正数前不显示+号C+语语言言程程序序设设计计教教程程第第11章章C+输输入入输输出出流流12分类分类操纵符操纵符功能功能小数点showpoint显示小数点*noshowpoint清除showpoint, 不显示小数部分为0的数的小数点进制基数showbase显示进制基数(前缀),八进制为0,十六进制为0 x或0X*noshowbase清除showbase, 不显示进制基数字母大写uppercase十六进制数中字母大写显示,科学计数法中e显示成大写E*noupercase清除upper

19、case, 十六进制与科学计数法中字母小写宣示布尔值boolalpha分别以true和false字符串形式表示真与假*noboolalpha清除boolalpha,恢复用数值表示bool型数流刷新unitbuf输出操作后刷新流*nounitbuf清除unibuf, 输出操作后不刷新流换行endl换行,并刷新输出流缓冲区插空ends插入空字符,并刷新输出流缓冲区过滤空ws过滤空字符域宽setw(n)设置当前域宽域填充setfill(c)设置域中空白的填充字符,c为字符,默认为空格浮点数精度setprecision(n)设置浮点数小数部分包括小数点的位数,默认为6设置格式setiosflags(f

20、lag)设置格式标志重设格式resetflags()重新设置格式为默认格式C+语语言言程程序序设设计计教教程程第第11章章C+输输入入输输出出流流13 2.链表类模板链表类模板1234567891011121314151617/* 程序名:p11_4.cpp * 功能: 格式操纵符举例 */# include using namespace std;int main() bool boolv(10); int x(100); long IFlags; IFlags=cout.setf(0,cout.flags(); coutDefault flag is:hexIFlagsendl; cout

21、After set Hex:cout.flags()endl; coutboolvalue:boolv boolalpha:boolalpha; coutboolv x=xendl; return 0; 运行结果运行结果: :Default flag is:201After set Hex:800boolvalue:1 boolalpha:true x=64 C+语语言言程程序序设设计计教教程程第第11章章C+输输入入输输出出流流145. 格式控制成员函数格式控制成员函数 表表11-5 格式控制成员函数格式控制成员函数分类分类函数原型函数原型功能功能域宽int width(int nw)设置当

22、前域宽域填充char fill(char c)设置域中空白的填充字符,c为字符,默认为空格浮点数精度int precision(int n)设置浮点数小数部分包括小数点的位数,默认为6设置格式long flags( long lFlags ) 设置格式标志见表11-2 从成员函数表中可以看出, 成员函数的功能与操纵符中的函数对应对应。如:width()与setw(),fill(c)与setfill(c),precision(n)与setprecision(n),flags(flag)与setiosflags(flag)分别对应。C+语语言言程程序序设设计计教教程程第第11章章C+输输入入输输出

23、出流流15 2.链表类模板链表类模板1234567891011121314151617181920/* 程序名:p10_5.cpp * 功能: 格式操纵符与成员函数对比 * By Antony * 11-24-2005 */# include # include using namespace std;int main() double PI=3.1415926535;int precision;coutfixed;coutPIendl;cout.width(8);cout.fill(0);for(precision=0;precision=9;precision+) cout.precisi

24、on(precision);coutPIendl;C+语语言言程程序序设设计计教教程程第第11章章C+输输入入输输出出流流16 2.链表类模板链表类模板212223242526272829coutPIendl; coutsetw(8)setfill(0);for(precision=0;precision=9;precision+) coutsetprecision(precision);coutPIendl;coutPI。 格式如下: cinobj1obj2; 提取操作符从与键盘相连的标准输入流cin中提取数据拷贝给相应的对象。数据的提取与拷贝是从输入回车开始的,提取操作符忽略了流中的空白、

25、制表符、回车,换行。当遇到流结束标志EOF(-1),或者提取了一个无效的值试图拷贝给对象时,提取操作符返回0(false) 给cin。 每个输入流都含有一系列错误状态位,当提取了一个无效值给对象时,比如:输入类型错时,除了返回出错信息false给cin外, 还会设置流的failbit状态位,结束提取操作。11.4 输入输入流流 C+语语言言程程序序设设计计教教程程第第11章章C+输输入入输输出出流流18 2.链表类模板链表类模板123456789101112131415/* 程序名:p11_6.cpp * 功能: 标准输入 */# include # include using namespa

26、ce std;int main() float f;int i;string s;while(cinfis) coutftitsendl; return 0; 运行结果运行结果: :2 a 3.4 5.6 7.8 9 a b 2 a3.4 5 .67.8 9 a C+语语言言程程序序设设计计教教程程第第11章章C+输输入入输输出出流流19表表11-6 输入流常用成员函数输入流常用成员函数函数原型函数原型说说 明明int get()提取一字符(包括空格),然后返回该字符的值;若没有读到字符,返回EOF,并设置流对象的failbit标志。istream& get( char& ch

27、 )提取一字符(包括空格)给ch,返回istream对象的引用;其余与get()相同。 istream& get(char* pch, int nCount, char delim = n)提取最多nCount-1个字符给pch数组,遇到第nCount个字符或遇分隔符delim(默认为n)或到达文件结束,则停止提取。存入pch中的字符串以null结尾,分隔符不存入pch。istream& getline( char* pch, int nCount, char delim = n)提取最多nCount-1个字符给pch数组, 遇到第nCount个字符或遇分隔符delim(默认为n)或到达文件结束,则停止提取。存入pch中的字符串以null结尾,分隔符不存入pch。istream& ignore( int nCount = 1, int delim = EOF)忽略数据流中delim分隔符号之前至多nCount个字符。缺省情况ignore()将从被调用的istream对象中读入一个字符EOF,并丢弃。int gcount() const返回前次运用get(),getline

温馨提示

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

评论

0/150

提交评论