C课件C输入输出流与文件系统.ppt
《C课件C输入输出流与文件系统.ppt》由会员分享,可在线阅读,更多相关《C课件C输入输出流与文件系统.ppt(47页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第1010章章 C+输入输入/输出流与文件系统输出流与文件系统学习目标理解C+的输入/输出流的概念;熟悉I/O流的工作过程;熟悉各种格式标志与各种格式控制方法;分清文本文件与二进制文件的区别;掌握文本文件的输入/输出的步骤与操作;掌握二进制文件的输入/输出的步骤与操作;会运用文件指针以及各种标志; C+中的I/O流实际上是一个处于传输状态的字节序列,这些字节序列按顺序从一个对象传送到另一个对象,在对象之间的“流动”。流流形象表示了信息从源到目的端的传送过程。 在C+程序中,流的操作包括数据的输入与输出。输入操作是字节从外输入操作是字节序列从外部设备(包括键盘、磁盘、网络连接)输入到内存,是字
2、节从设备到内存的流动。输出操作是从内存输出到外部设备(如显示器、打印机、磁盘、网络连接),是字节从内存到外部设备的流动。10.1 输入输入/输出流的概念输出流的概念 basic_ios basic_istream basic_ostream basic_ifstream basic_iostream basic_ofstream basic_fstream ios_base 在C+中,数据的输入/输出是通过I/O流类库实现的。C+的I/O流类流类库库采用功能强大的类层次层次结构结构实现,它能够提供数百种与数据输入和输出相关的功能,I/O流类库中各个类模板之间的层次关系如图11-1所示 I/O流
3、类模板流类模板是流类库的基础,描述如下: ios类是类模板basic_ios的窄字符的实例,是所有I/O流类的基础类,描述了流的基本性质。 派生类istream与ostream从公共基类继承了一些成员,在这些继承来的数据成员中,大部分用于描述流的属性或特征,如流的格式与状态。 除了继承来的成员外,istream与ostream各自添加了合适的本地成员,并重载了适当的运算符。例如istream增加了在流中读取数据和移动数据的方法。对提取运算符进行了重载。 iostream 对istream和ostream进行了多重派生,因而它既继承了读取流操作,又继承了写入流操作。但iostream没有增加额外
4、的数据成员,而且除了构造函数与析构函数外,没有新增其他成员函数。 ifstream与ofstream分别用于文件的输入与输出,派生于iostream的fstream用于控制文件流的输入输出。 10.1 输入输入/输出流的概念输出流的概念 要从I/O流中获取数据或向流中添加数据,必须使用流插入运算符流插入运算符“”。 “”本来在C+中被定义为左移位运算符和右移位运算符的,但为了I/O的需要,C+又将它们进行了重载重载,以便能用它们输入或输出各种类型的数据。 输出流是就是流向输出设备的数据信息。输出流对象是数据信息流向的目标。 在C+中,最重要的三个输出流是ostream,fostream和ost
5、rstream。ostream类可以提供无格式化输出和格式化输出。 例如:用插入运算符输出标准类型数据;用put成员函数输出字符;用write成员函数实现无格式输出。 最常用的输出方法是在cout上用插入运算符插入运算符,插入运算符可以接受任何标准类型的实参,包括const char *、标准库string、complex等类型。实参可以是任何表达式包括函数调用,只要其结果是能被插入运算符能接受的数据类型即可。10.2 输出流输出流 2.链表类模板链表类模板123456789101112131415161717181920212324252627/* 程序文件名: p10_1.cpp * 功能
6、:演示的功能 * */# include # include # include using namespace std;int main() char *s1=a c string; 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
7、0; 运行结果运行结果: :a c stringa c+ string(3.14159,-1.234)12 11 10&i:0012FF4C pi:0012FF4C&s1:0012FF70 s1:00473040 2.链表类模板链表类模板123456789101112131415/* 程序文件名: p10_2.cpp * 功能:演示的优先级 * 设计者: Antony * 时 间: 8-18-2006 */# include using namespace std;int main() int val1(10),val2(20);coutthe larger of val1,val2 is:;
8、cout val2) ? val1 : val2; / cout10endl; 错误 return 0; 运行结果运行结果: :the larger of 10, 20 is 0 格式标志格式标志是一组用于设置I/O流格式状态字的一个数,这些格式标志属于ios类。 10.3.1 格式控制标志格式控制标志 表10-2 I/O流格式标志功能表 表中带*号的表示默认设置,|为或运算。分 类标 志 符功 能进制*ios:dec指定整数以十进制显示ios:oct指定整数以八进制显示ios:hex指定整数以十六进制显示对齐ios:left在域中左对齐,填充字符加到右边*ios:right在域中右对齐,填充
9、字符加到左边ios:internal数字的符号在域中左对齐,数字在域中右对齐,填充字符加到中间浮点数*ios:fixed以小数形式显示浮点数, 默认小数部分为6位(包括小数点)ios:scientific以科学计数法形式显示浮点数空格*ios:skipws忽略输入流的空格正号ios:showpos在正数前显示+号小数点ios:showpoint不管浮点数小数部分是否为0,总是显示小数点进制基数ios:showbase显示进制基数(前缀),八进制为0,十六进制为0 x或0X字母大写ios:uppercase十六进制数中字母大写显示,科学记数法中e显示成大写E布尔值ios:boolalpha分别以
10、true和false字符串形式表示真与假流刷新ios:unitbuf输出操作后刷新流进制组合ios:basefielddec | hex | oct对齐组合ios:adjustfieldinternal | left | right浮点组合ios:floatfieldfixed | scientific 每一个输入/输出流对象都维护一个格式状态字格式状态字,用它表示流对象当前的格式状态并控制流的格式,例如整型值的进制基数或浮点数的精度。C+提供了多种格式控制的方法,如使用操纵符修改对象的格式状态字来控制流的格式、运用成员函数。10.3.1 格式控制标志格式控制标志 表表10-3 格式状态字设置
11、函数格式状态字设置函数函数函数功能功能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与IMask 可以是单个格式标志,也可以是与运算& 和或运算|将格式标志连接的表达式,还可以是一个长整型数。 2
12、.链表类模板链表类模板123456789101112131415161718192021/* 程序名:p10_3.cpp * 功能: 揭开格式标志的秘密 * By Antony * 8-19-2006 */# include using namespace std;struct fmtflags long flag; char flagname12; flags18=ios:hex,hex,ios:dec,dec,ios:oct,oct,ios:basefield,basefield,ios:internal,internal,ios:left,left,ios:right,right,ios
13、:adjustfield,adjustfield, ios:fixed,fixed,ios:scientific,scientific, 2.链表类模板链表类模板222324252627282930313233343536373839 ios:basefield,basefield,ios:showbase,showbase,ios:showpoint,showpoint, ios:showpos,showpos,ios:skipws,skipws,ios:uppercase,uppercase,ios:boolalpha,boolalpha,ios:unitbuf,unitbuf;int m
14、ain() 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; 运行结果运行结果: :Default flag is:201800hex200dec400octe00basefield100internal40left80right1c0adjustfield2000fixed1000scie
15、ntifice00basefield8showbase10showpoint20showpos1skipws4uppercase4000boolalpha2unitbuf C+还提供了许多流操纵符,用于执行格式化的输入/输出操作,这些操纵符可以直接用在流中。10.3.2 格式操纵符格式操纵符 表表10-4 格式操纵符格式操纵符分类分类操纵符操纵符功能功能进制*dec指定整数以十进制显示oct指定整数以八进制显示hex指定整数以十六进制显示setbase(n)设定以n进制显示,n为8,10,16对齐left在域中左对齐,填充字符加到右边*right在域中右对齐,填充字符加到左边internal数
16、字的符号在域中左对齐,数字在域中右对齐,填充字符加到中间浮点数显示*fixed以小数形式显示浮点数, 默认小数部分为6位(包括小数点)scientific以科学计数法形式显示浮点数空格*skipws忽略输入流的空格noskipws清除skipws,恢复输入流的空格正号showpos*noshowpos在正数前显示+号清除showpos, 在正数前不显示+号showpos*noshowpos在正数前显示+号清除showpos, 在正数前不显示+号分类分类操纵符操纵符功能功能小数点showpoint显示小数点*noshowpoint清除showpoint, 不显示小数部分为0的数的小数点进制基数s
17、howbase显示进制基数(前缀),八进制为0,十六进制为0 x或0X*noshowbase清除showbase, 不显示进制基数字母大写uppercase十六进制数中字母大写显示,科学计数法中e显示成大写E*noupercase清除uppercase, 十六进制与科学计数法中字母小写宣示布尔值boolalpha分别以true和false字符串形式表示真与假*noboolalpha清除boolalpha,恢复用数值表示bool型数流刷新unitbuf输出操作后刷新流*nounitbuf清除unibuf, 输出操作后不刷新流换行endl换行,并刷新输出流缓冲区插空ends插入空字符,并刷新输出流
18、缓冲区过滤空ws过滤空字符域宽setw(n)设置当前域宽域填充setfill(c)设置域中空白的填充字符,c为字符,默认为空格浮点数精度setprecision(n)设置浮点数小数部分包括小数点的位数,默认为6设置格式setiosflags(flag)设置格式标志重设格式resetflags()重新设置格式为默认格式 2.链表类模板链表类模板1234567891011121314151617/* 程序名:p10_4.cpp * 功能: 格式操纵符举例 */# include using namespace std;int main() bool boolv(10); int x(100); l
19、ong IFlags; IFlags=cout.setf(0,cout.flags(); coutDefault flag is:hexIFlagsendl; coutAfter 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 10.3.3 格式控制成员函数格式控制成员函数 表表10-5 格式控制
20、成员函数格式控制成员函数分类分类函数原型函数原型功能功能域宽int width(int nw)设置当前域宽域填充char fill(char c)设置域中空白的填充字符,c为字符,默认为空格浮点数精度int precision(int n)设置浮点数小数部分包括小数点的位数,默认为6设置格式long flags( long lFlags ) 设置格式标志见表10-2 从成员函数表中可以看出, 成员函数的功能与操纵符中的函数对应对应。如:width()与setw(),fill(c)与setfill(c),precision(n)与setprecision(n),flags(flag)与setio
21、sflags(flag)分别对应。 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+)
22、cout.precision(precision);coutPIendl; 2.链表类模板链表类模板212223242526272829coutPIendl; coutsetw(8)setfill(0);for(precision=0;precision=9;precision+) coutsetprecision(precision);coutPIendl;coutPI。 格式如下: cinobj1obj2; 提取操作符从与键盘相连的标准输入流cin中提取数据拷贝给相应的对象。数据的提取与拷贝是从输入回车开始的,提取操作符忽略了流中的空白、制表符、回车,换行。当遇到流结束标志EOF(-1),
23、或者提取了一个无效的值试图拷贝给对象时,提取操作符返回0(false) 给cin。 每个输入流都含有一系列错误状态位,当提取了一个无效值给对象时,比如:输入类型错时,除了返回出错信息false给cin外, 还会设置流的failbit状态位,结束提取操作。10.4 输入输入流流 2.链表类模板链表类模板123456789101112131415/* 程序名:p10_6.cpp * 功能: 标准输入 */# include # include using namespace std;int main() float f;int i;string s;while(cinfis) coutftitse
24、ndl; return 0; 运行结果运行结果: :2 a 3.4 5.6 7.8 9 a b 2 a3.4 5 .67.8 9 a 表表10-6 输入流常用成员函数输入流常用成员函数函数原型函数原型说说 明明int get()提取一字符(包括空格),然后返回该字符的值;若没有读到字符,返回EOF,并设置流对象的failbit标志。istream& get( char& ch )提取一字符(包括空格)给ch,返回istream对象的引用;其余与get()相同。 istream& get(char* pch, int nCount, char delim = n)提取最多nCount-1个字符给
25、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个
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课件 输入输出 文件系统
限制150内