C语言的I∕O流类库.ppt

上传人:牧羊曲112 文档编号:6503927 上传时间:2023-11-07 格式:PPT 页数:65 大小:325.99KB
返回 下载 相关 举报
C语言的I∕O流类库.ppt_第1页
第1页 / 共65页
C语言的I∕O流类库.ppt_第2页
第2页 / 共65页
C语言的I∕O流类库.ppt_第3页
第3页 / 共65页
C语言的I∕O流类库.ppt_第4页
第4页 / 共65页
C语言的I∕O流类库.ppt_第5页
第5页 / 共65页
点击查看更多>>
资源描述

《C语言的I∕O流类库.ppt》由会员分享,可在线阅读,更多相关《C语言的I∕O流类库.ppt(65页珍藏版)》请在三一办公上搜索。

1、第11章 C+语言的I/O流类库,本章的最主要目的就是把对象保存到磁盘文件中并从磁盘文件重建对象。当然C+可完成更多的任务。C+语言中并没有输入/输出语句,而是在标准库里包含了一个I/O流类库,它与标准模板库同为C+标准库中最重要的组成部分。数据从一个对象到另一个对象的传送被抽象为“流”。数据的输入/输出就是通过输入/输出流来实现的。流是一种抽象的概念,负责在数据的产生者和数据的使用者之间建立联系,并管理数据的流动。,第11章 C+语言的I/O流类库,11.1 I/O流类库的功能,11.3 格式化输入输出操作,11.2 常用的读写操作,11.4 插入符和提取符的重载,11.7 流错误处理,11

2、.5 磁盘文件的输入和输出操作,下 课,11.6 字符串流操作,11.1 I/O流类库的功能,整个流类体系是一个派生类体系。按ANSI C+标准,类ios是抽象类,它的析构函数是虚函数,它的构造函数为保护的,作为所有基本流类的基类。VC+中有一个构造函数ios(streambuf*)为公有,与ANSI C+不同。,11.1 I/O流类库的功能11.1.1 基本的I/O流类库,在流类库中,最重要的两部分功能为标准输入/输出(standard input/output)和文件处理。在C+的流类库中定义了四个全局流对象:cin,cout,cerr和clog。可以完成人机交互的功能。cin标准输入流对

3、象,键盘为其对应的标准设备。cout标准输出流对象,显示器为标准设备。cerr和clog标准错误输出流,输出设备是显示器。其中cin、cout和clog是带缓冲区的,缓冲区由streambuf类对象来管理。而cerr为非缓冲区流,一旦错误发生立即显示。要使用这四个功能,必须包含文件。,11.1.2 文件I/O操作流类库,类ifstream由类istream单一派生,专门用来处理文件的输入操作。类ofstream由类ostream单一派生,专门用来处理文件的输出操作。类fstream由类iostream单一派生,专门用来处理文件的输入和输出操作。类ifstream、ofstream、fstrea

4、m拥有公共基类:fstreambase。利用上述类创建流对象,类中的成员函数open用来打开文件,成员函数close用来关闭文件,有关细节将在11.5节中讲述。,11.1.3 字符串流操作流类库,类istrstream由类istream单一派生,专门用来处理字符串的输入操作。类ostrstream由类ostream单一派生,专门用来处理字符串的输出操作。类strstream由类iostream单一派生,专门用来处理字符串的输入和输出操作。类istrstream、ostrstream、strstream拥有公共基类:strstreambase。有关字符串流操作的细节将在11.6节中讲述。,11.

5、2 常用的读写操作,11.2.1 屏幕输出操作1.使用预定义的插入符j?i:j)endl;如果不加(),将因运算顺序不对而编译出错。,【例11.1】插入符用法示例,#include#includevoid main()cout字符串This is a string.的长度为:;coutstrlen(This is a string.)endl;cout字符串This is a string.占的空间为:;coutsizeof(This is a string.)endl;运行结果为17和18,因为strlen是求字符串的长度,即字符串中字符的个数;sizeof是求占用内存的字节数,其中包括字符

6、串结束标志空字符占用的内存。strlen在string.h中定义,sizeof是一个运算符。,【例11.2】输出变量地址值示例,#includevoid main()int x(100);int*px=运行结果显示直接输出地址值时是十六进制,若要以十进制显示需做强制类型转换为长整型。,【例11.3】编写判断除数为0的整数除法程序,#includevoid fun(int i,int j)if(j)coutxy;fun(x,y);请仔细阅读本程序,并与课本上的程序比较。,2.使用成员函数put()输出一个字符put函数函数原型为:ostream 使用put函数向屏幕输出字符的格式为:cout.p

7、ut(字符),【例11.4】用成员函数put()输出一个字符的例子#includevoid main()coutBEIJINGn;cout.put(B).put(E).put(I).put(J).put(I).put(N).put(G).put(n);char c1=65,c2=66,c3=67;cout.put(c1).put(c2).put(c3).put(n);请仔细阅读本程序,注意函数put()的值是ostream类对象的引用,连续输出时连续加.put(),3.使用成员函数write()输出一个字符串write函数函数原型为:ostream 使用write函数向屏幕输出字符的格式为:c

8、out.write(字符指针,字符个数),【例11.5】用成员函数write()输出一个字符串的例子#include#includevoid print(char*s)cout.write(s,strlen(s).put(n);cout.write(s,6)n;void main()char*str=我爱北京天安门!;cout字符串为:strn;print(str);请仔细阅读本程序,注意函数write()的值是ostream类对象的引用,连续输出时连续加.write(),11.2.2 键盘输入操作,1.使用预定义的提取符是右移位运算符的重载,格式为:输入流源头输入流目的地需从键盘接收数据时,

9、键盘就是输入流源头,输入流目的地应是变量名,头文件iostream.h中定义有istream类的全局对象cin就代表键盘。提取符依次从输入源中提取一个数据项,连续提取时,数据项之间用空格、制表符、换行等空白符分隔。如对语句cinxyz;可键入:18 19 20,1.使用预定义的提取符,标准设备(键盘)输入是最不安全的,注意以下几点,可以避免错误:cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取时,是从缓冲区中拿。如果一次输入过多,会留在那儿慢慢用,如果输入错了,必须在回车之前修改,如果回车键按下就无法挽回了。只有把输入缓冲区中的数据取完后,才要求输入新的数据。不可能用刷新来清除缓冲区,所

10、以不能输错,也不能多输!输入的数据类型必须与要提取的数据类型一致,否则出错,出错只是在流的状态字state(枚举类型io_state)中对应位置位(置1),程序继续。所以要提高健壮性,就必须在编程中加入对状态字state的判断。空格和回车都可以作为数据之间的分格符,所以多个数据可以在一行输入,也可以分行输入。但如果是字符型和字符串,则空格(ASCII码为32)无法用cin输入,字符串中也不能有空格。回车符也无法读入。,【例11.6】提取符用法示例,#includevoid main()int x,y;coutxy;cout(x,y)n;,2.使用成员函数get()输入一个字符串get函数函数原

11、型有多个,其中比较简单的2个是:char get();、istream 前者提取的字符作为函数值,后者提取的字符放在参数c使用get函数从键盘提取字符的格式分别为:cin.get()、cin.get(字符变量),【例11.7】用成员函数get()从键盘提取字符的例子#includevoid main()char ch;cout请仔细阅读本程序,注意函数cin.get()的值是字符,#includevoid main()char ch1,ch2;cout输入字符串:;while(cin.get(ch1).get(ch2)cout.put(ch2).put(ch1);请仔细阅读本程序,注意这种格式

12、的函数get()的值是istream类对象的引用,连续输入时连续加.get(),【例11.8】使用成员函数get带参数的形式输入一个字符,#includeconst int N=40;void main()char s1N,s2N;couts1;/输入时遇空格、制表符、回车等结束,但这些结束符留在缓冲区中 couts1=s1endl;cin.get(s2,N);/从缓冲区中最多接收N-1个字符,放数组s2中,界定符为隐含换行符 couts2=s2endl;请仔细阅读本程序,注意get函数的第三种原型:istream 这种格式的函数get()的值是istream类对象的引用,使用格式为:cin.

13、get(字符指针,整数n,界定符)该函数直接从缓冲区中最多读取n-1个字符数据,若前面遗留有换行,则结束。,【例11.9】混合使用成员函数get、提取符输入字符,比较区别,3.使用成员函数getline()输入一行字符getline函数原型是:istream 功能是最多提取n-1个字符放在buf为首地址的缓冲区中,参数ch为终止符,隐含的终止符为换行符。使用getline函数从键盘提取字符串的格式为:cin.getline(字符指针,整数n,终止界定符)输入字符少于n-1时,接收实际输入字符数,并将缓冲区的回车符清除,若输入字符数不少于n-1时,多余的字符及回车符留在缓冲区。该函数不能接受换行

14、字符(n)。该函数终止读取字符的条件为:读取n-1个字符遇到参数指定的终止符遇到文件结束符(Ctrl+Z)或回车符。,【例11.10】输入若干行字符,求出最长行的字符个数及输入行数。使用成员函数getline()#includeconst int SIZE=80;void main()char bufSIZE;int lcnt=0,lmax=-1;coutlmax)lmax=count;coutline#lcnt:countendl;cout.write(buf,count).put(n).put(n);coutendl;cout最长行字符数:lmaxendl;cout总行数:lcntendl

15、;,4.使用成员函数read()输入一行字符read函数原型是:istream 功能是最多提取n-1个字符放在buf为首地址的缓冲区中使用read函数从键盘提取字符串的格式为:cin.getline(字符指针,整数n)最多接收n个字符,接受字符中可以包括换行符(n)。该函数终止读取字符的条件为:读取n个字符遇到文件结束符(Ctrl+Z)。,【例11.11】输入若干行字符,并输出。使用成员函数read()。,#includevoid main()const int SIZE=80;char bufSIZE=;cout、read、get、getline四种读取字符方法的异同(终止条件、可接受字符的

16、范围、可接受字符的多少、使用格式、是否缓冲等)。,11.3 格式化输入输出操作,1.控制格式的标志位定义为公有的无名的枚举类型:enum skipws=0 x0001,/跳过输入中的空白字符 left=0 x0002,/输出左对齐 right=0 x0004,/输出右对齐 internal=0 x0008,/在输出符号或数字字符后填充 dec=0 x0010,/在输入输出时将数据按十进制处理 oct=0 x0020,/在输入输出时将数据按八进制处理 hex=0 x0040,/在输入输出时将数据按十六进制处理 showbase=0 x0080,/在输出时带有表示数制基的字符,C+在类ios中提供

17、格式化输入输出,有两种方法控制输入输出格式:一是使用标志位和成员函数,二是使用控制符。11.3.1 使用成员函数进行格式输出,11.3 格式化输入输出操作,showpoint=0 x0100,/输出浮点数时,必定带小数点 uppercase=0 x0200,/输出十六进制,用大写字母 showpos=0 x0400,/输出正数时,加”+”号 scientific=0 x0800,/科学计数方式输出浮点数 fixed=0 x1000,/定点数方式输出实数 unitbuf=0 x2000,/插入后,立即刷新流的缓冲区 stdio=0 x4000/插入后,立即刷新stdout和stderr,该枚举量

18、说明中每一个枚举量实际对应两字节数据(16位)中的一个位,所以可以同时采用几个格式控制,只要把对应位置1即可,这样既方便又节约内存。取多种控制时,用或“|”运算符来合成,合成为一个长整型数,在ios中为:protected:long x_flags;这个长整型数据成员被称为标志字。,11.3 输入输出的格式控制,类ios中还设置了三个输入输出流格式控制标志:protected:int x_precision;/标志浮点数精度,缺省为6位 int x_width;/输出域宽,缺省域宽为0,/重设域宽只对其后第一输出项有效,如域宽不足,则不受限制 char x_fill;/标志域宽有富余时填入的字

19、符,2.设置标志字的成员函数long flags()返回标志字函数。long flags(long)函数值为更新前的标志字,参数作更新后的标志字,long setf(long setbits,long field)该函数先将第二个参数(转换为二进制)中为1的标志位置0,再将第一个参数(转换为二进制)中为1的标志位置1。函数值为设置前标志字。,long setf(long)设置参数(转换为二进制)中为1的标志位置1,其余标志位不变。函数值未设置前的标志字。long unsetf(long)设置参数(转换为二进制)中为 1的标志位置0,其余标志位不变。函数值未设置前的标志字。,在ios中定义有如下

20、静态整型常量:,static const long adjustfield;其值=left|right|internal=0 x2|0 x4|0 x8=0 xestatic const long basefield;其值=dec|oct|hex=0 x10|0 x20|0 x40=0 x70static const long floatfield;其值=scientific|fixed=0 x800|0 x1000=0 x1800实际上,上述3个组合设置是有矛盾的,如中又要左对齐,又要右对齐是不可能的,自己可以编程测试实际结果,上述组合常用于清除标志位。例如,若需清除数制标志后,再设置十六进制

21、标志,可调用成员函数:cout.setf(ios:hex,ios:basefield),3.控制输出格式的成员函数,IOS类中有如下控制输出格式的成员函数:int width();int width(int);前者函数值为当前输出的数据宽度;后者参数为设置的数据输出宽度,函数值为设置前的数据输出宽度值;默认为实际需要的最少字符数,设置宽度小于默认值时,设置无效。char fill();char fill(char);前者函数值为当前使用的填充字符;后者参数为设置的填充字符,函数值为设置前使用的填充字符;默认填充字符为空格。int precision();int precision(int);前

22、者函数值为当前使用的浮点数有效数字个数;后者参数为设置的浮点数有效数字个数,函数值为设置前使用的浮点数有效数字个数;单精度最多7位(默认6位)有效数字,双精度最多15位(默认6位)有效数字,长双精度最多19位(默认6位)有效数字。,【例11.12】设置清除标志位的例子,#includevoid main()int a=1234;double b=12.345678;coutcout.flags()endl;cout.setf(ios:hex,ios:basefield);coutcout.flags()endl;coutaendl;cout.setf(ios:showbase);coutaen

23、dl;cout.setf(ios:uppercase);coutaendl;cout.setf(ios:oct,ios:basefield);coutaendl;long oldflag=cout.setf(ios:dec,ios:basefield);coutaendl;cout.setf(ios:showpos);coutaendl;cout.flags(oldflag);coutaendl;coutcout.flags()endl;coutbendl;cout.setf(ios:scientific,ios:floatfield);coutbendl;coutcout.flags()en

24、dl;/运行程序,观察结果。,【例11.13】设置控制小数位数的例子,#includevoid main()double d1=12.34567,d2=12.000;coutd1endld2endl;cout.setf(ios:showpoint);coutd1endld2endl;运行程序,观察结果,注意:默认的是可以不带小数点及小数部分的0默认的有效数字是6位。,【例11.14】设置输出对齐格式的例子,#includevoid main()int i=12345;coutiendl;cout.width(10);cout.fill(#);cout.setf(ios:left,ios:sdj

25、ustfield);coutiendl;cout.setf(ios:right,ios:sdjustfield);coutiendl;cout.precision(6);double d=123.456789;coutdendl;cout.setf(ios:scientific,ios:floatfield);coutdendl;cout宽度:cout.width();运行程序,观察结果,注意宽度设置一次有效,再次使用需重新设置,设置有冲突时会怎模样?怎样研究这个问题?,11.3.2 使用控制符进行格式输出,控制符又称操作子,是定义在头文件iomanip.h中的对象,可以直接插入到数据流中,被

26、操作。下表列出了VC+支持的操作子:,【例11.15】按整数的不同基数设置输出格式的例子,#include#includevoid main()int n;coutn;coutn的十六进制形式为:hexnendl;coutdecn的八进制形式为:octnendl;coutdecn的十进制形式为:nendl;运行程序,观察结果,注意进位制基数设置后永久有效,要改变必须重新设置。,【例11.16】设置浮点数精度和填充符的例子,#include#include#includevoid main()double n=sqrt(3);for(int i=0;i10;i+)coutsetprecision

27、(i)setw(12)setfill(*);coutnendl;运行程序,观察结果,注意输出宽度、输出精度(有效数字位数)、填充字符等设置方法。,【例11.17】利用设置填充符、宽度的方法输出菱形,#include#includevoid main()for(int i=7;i1;i-)coutsetfill()setw(i)setfill(*);coutsetw(15-2*i)*endl;for(i=1;i8;i+)coutsetfill()setw(i)setfill(*);coutsetw(15-2*i)*endl;运行程序,观察结果,注意打印图形的算法研究,找各行字符个数的规律,注意与

28、【例4.16】比较。,11.4 插入符()的重载,为了对类的对象进行插入及提取操作,可以编写重载函数实现插入符、提取符的重载。【例11.18】重载提取符和插入符,实现中国日期格式的输入输出。(类定义、重载运算符的友元函数定义)#includeclass Date public:Date(int y,int m,int d)Year=y;Month=m;Day=d;friend ostream,【例11.18】重载提取符和插入符,实现中国日期格式的输入输出。(主函数定义),void main()Date d(2003,3,18);coutd;cout新日期:d;,上述主程序中,有5个插入符(),

29、这些符号中哪些使用了友元函数定义的运算符重载,如何区别是否重载?,11.5 磁盘文件的输入和输出操作,本节中文件指的是磁盘文件。C+根据文件(file)内容的数据格式,可分为两类:二进制文件和文本文件。文本文件由字符序列组成,也称ASCII码文件,在文本文件中存取的最小信息单位为字符(character),而二进制文件中存取的最小信息单位为字节(Byte)。,11.5.1 文件的打开与关闭,11.5.2 文本文件的读写,11.5.3 二进制文件的读写,11.5.4 随机文件的读写,11.5.5 文件操作的其它函数,11.5 磁盘文件的输入与输出操作,11.5.1 文件的打开和关闭操作1.打开文

30、件说明一个文件流对象,这又被称为内部文件:ifstream 输入文件流对象名;/只可用于输入ofstream 输出文件流对象名;/只可用于输出fstream 输入输出文件流对象名;/既可用于输入又可用于输出 使用对象的成员函数open打开文件:文件流对象名.open(文件名,打开方式);此处的文件名必须是外存上的文件名(外部文件),必要时应指明路径,open函数的作用是在内部文件与外部文件之间建立联系。、两步可以和二而一,即用对象初始化时的构造函数代替open函数,如:ifstream 输入文件流对象名(文件名,打开方式),文件访问方式常量表(ios中定义的公有枚举常量),11.5.1 文件的

31、打开和关闭操作,文件流中三个打开文件的成员函数(open)的原型为:void ifstream:open(const char*,int=ios:in,int=filebuf:openprot);void ofstream:open(const char*,int=ios:out,int=filebuf:opernprot);void fstream:open(const char*,int,int=filebuf:openprot);第一个参数为要打开的磁盘文件名。第二个参数为打开方式,有输入(in)、输出(out)等。第三个参数为指定打开文件的保护方式,一般取缺省。例如:要新建磁盘文本文件

32、file.txt,并置写状态,可如下进行:ofstream outfile;outfile.open(file.txt,ios:out);或者:ofstream outfile(file.txt,ios:out);或者:ofstream outfile;outfile.open(file.txt);或者:ofstream outfile(file.txt);,11.5.1 文件的打开和关闭操作,打开文件也应该判断是否成功,若成功,文件流对象值为非零值,不成功为0(NULL),文件流对象值物理上就是指它的地址。下面是打开一个文件的完整程序段:fstream iofile(myfile.txt,i

33、os:in|ios:out);if(!iofile)cout不能打开文件:myfile.txtendl;exit(1);/失败退回操作系统2.关闭文件操作关闭文件将清理与打开的文件有关的内存与外存,这样即可减少内存负担又可保证文件信息安全。关闭文件使用成员函数close进行:文件流对象名.close();/文件流对象名就是内部文件名。,11.5.2 文本文件的读写操作【例11.19】使用插入符向文本文件中写信息,#include/定义标准输出流对象cout#include/定义文件流类fstream#include/定义abort函数void main()fstream outfile;out

34、file.open(file1.dat,ios:out);if(!outfile)coutfile1.dat打不开!n;abort();outfile这是一个程序。n这是一个字符串。nok;outfile.close();注意分析程序中的3个插入符()的作用注意3个包含文件的作用注意该程序的运行结果如何检验函数abort()的作用。,【例11.20】使用成员函数getline将文本文件file1.dat中的信息读出并显示在屏幕上。,#include/定义标准输出流对象cout#include/定义文件流类ifstream#include/定义abort函数void main()ifstream

35、 infile(file1.dat);if(!infile)coutfile1.dat打不开!n;abort();char s80;while(!infile.eof()infile.getline(s,sizeof(s);coutsendl;infile.close();注意,定义内部文件与打开文件的格式与例19的区别 循环条件的含义 读取文件信息是否可用提取符?,【例11.21】使用成员函数get、put读写文本文件。,#include/定义标准输出流对象cout#include/定义文件流类fstream#include/定义abort函数#include/定义strlen函数void

36、main()fstream infile,outfile(file2.dat,ios:out);if(!outfile)coutfile2.dat打不开!n;abort();char s=我喜欢C程序设计。;for(int i=0;i=(int)strlen(s);i+)outfile.put(si);outfile.close();infile.open(file2.dat,ios:in);if(!infile)coutfile2.dat打不开!n;abort();char ch;while(infile.get(ch)cout.put(ch);coutendl;infile.close()

37、;注意,该程序中共有几个内部文件?有几个外部文件?内外如何对应?用操作系统的办法如何显示本程序产生的外部文件?,【例11.22】编程拷贝文本文件,使用成员函数get、put读写。,#include/定义标准输出流对象cout#include/定义文件流类fstream#include/定义abort函数void main()fstream infile(file2.dat,ios:in),outfile(file3.dat,ios:out);if(!infile)coutfile2.dat打不开!n;abort();if(!outfile)coutfile3.dat打不开!n;abort();

38、char ch;while(infile.get(ch)outfile.put(ch);infile.close();outfile.close();注意,该程序中共有几个内部文件?几个外部文件?内外如何对应?该程序运行前必须有哪些先决条件?该程序运行后会产生什么结果?能否用操作系统的办法检验本程序的成果?,11.5.3 二进制文件的读写操作,二进制文件打开方式中应指定:ios:binary写二进制文件使用成员函数:write()读二进制文件使用成员函数:read()这两个函数定义在fstream.h中原型分别为:ostream第1个参数要读写的字符指针,即字符串,向文件中写时,字符串不能被改

39、变;第2个参数为要读写字符的个数。函数的使用格式为:二进制内部文件名.write(待写入的字符串地址,字符串长度)二进制内部文件名.read(字符串读入地址,字符串长度),【例11.23】使用成员函数read、write读写二进制文件,#include/定义标准输出流对象cout#include/定义文件流类fstream#include/定义abort函数struct personchar name80;double height;unsigned short age;person people5=马,1.78,35,张,1.68,24,胡,1.90,40,鲁,1.89,50,郎,2,18;

40、void main()fstream file(file4.dat,ios:in|ios:out|ios:binary);if(!file)coutfile4.dat打不开!n;abort();for(int i=0;i5;i+)file.write(char*),【例11.24】存储本科生、硕士生信息文件(定义本科生),#include/定义标准输出流对象cout#include/定义文件流类fstream#include/定义字符串处理函数#include/定义输入输出控制符(控制子)class Studentpublic:Student(char*pN,unsigned num,doub

41、le g)strcpy(Name,pN);uID=num;grade=g;virtual void Print(ostream,【例11.24】存储本科生、硕士生信息文件(定义研究生),class Master:public Studentpublic:Master(char*pN,unsigned num,double g,char*pdN):Student(pN,num,g)strcpy(dName,pdN);void Print(ostream 注意,插入符是重载的,插入符的重载定义中,Print动态联编。,11.5.4 随机文件的读写操作,从文件头开始读或从文件尾开始写,称为顺序读写

42、在文件的任意位置进行读写操作,称为随机读写操作,可随机读写的文件称为随机文件。随机读写文件需要:按读写方式打开文件使用定位函数将读写指针定位到所需位置,读写指针只有一个,但是有读、写两组函数对它进行操作使用读写函数对文件进行读写读指针定位的成员函数为:seekg()其原型为 istream其中位置和偏移量为长整数,参照位置为下列3个之一:ios:beg(值为0)、ios:cur(值为1)、ios:end(值为2)分别表示文件开头、当前位置、文件结尾,写指针定位的成员函数为:seekp()其原型为 ostream其中位置和偏移量为长整数,参照位置为下列3个之一:ios:beg(值为0)、ios:

43、cur(值为1)、ios:end(值为2)分别表示文件开头、当前位置、文件结尾取当前读指针位置的成员函数原型为:long teelg()取当前写指针位置的成员函数原型为:long teelp()这两个取指针位置函数返回的长整数表示读写的当前位置距离文件开头的字节数。一般指针定位、取指针位置的函数的使用格式为:内部文件名.seekp(偏移量,参照位置)内部文件名.seekg(偏移量,参照位置)内部文件名.tellg()、内部文件名.tellp()文件读写结束应注意使用close函数关闭文件,【例11.25】存储整数的二进制文件,#include#include#includevoid main(

44、)fstream file(file5.dat,ios:in|ios:out|ios:binary);if(!file)coutfile5.dat打不开!n;abort();for(int i=1;i=20;i+)file.write(char*)注意,文件中读写数字的方法,读写指针定位的方法。,【例11.26】存储对象数组的二进制文件,#include#include#includevoid main()struct student char name50;long number;double totalscord;stu5=马,202001,85.5,李,202023,85.9,郭,202

45、045,91.2,胡,202067,93.1,严,202076,78.5;int len=sizeof(student);student s1;fstream file1(file6.dat,ios:out|ios:in|ios:binary);if(!file1)coutfile6.dat打不开!n;abort();for(int i=0;i5;i+)file.write(char*)注意,文件中读写对象的方法,读写指针定位的方法。,11.5.5 文件操作的其它函数,1.跳过输入流中指定数量的字符的成员函数原型为:istream 函数clear清除错误输入设置的状态字,使输入流恢复正常函数i

46、gnore则跳过一行错误的输入。,2.退回一个字符到输入流中的函数原型为:istream 函数putback将刚刚读入的非数字字符退回输入流,供再次读入,11.6 字符串流操作,可以把流的概念连接到字符串(string)上。串可以看作字符流。可以用输入输出操作来完成串流的操作。串流是与内存相关,所以也称内存流。类包括ostrstream、istrstream、strstream。串流类对象可以保存字符,也可以保存整数、浮点数。串流类对象采用文本方式。其构造函数常用下面几个:istrstream(const char*);/字符串流输入类istrstream(const char*,int);/

47、字符串流输入类ostrstream(char*,int,int=ios:out);/字符串流输出类其中第2个参数说明数组大小,第3 个参数表示字符串流的操作方式,隐含为out,也可以是app、ate。ostrstream中提供一些成员函数,如返回流中已插入的字符个数:int pcount();返回流存放字符串的数组地址值:char*str();成员函数的使用方法是:流对象名.成员函数名(),11.6 字符串流操作,例:char ch,str36=”This is a book.n”;istrstream input(str);inputch;/从字符串流对象(串)读入一个字符 cout#inc

48、ludevoid main()char buf80;ostrstream out1(buf,sizeof(buf);int m=25;for(int i=0;i6;i+)out1m=(m+=10);out10;coutbuf:bufendl;double d=123.45678;out1.setf(ios:fixed|ios:showpoint);out1.seekp(0);out1d的值是:d0;coutbufendl;char*pstr=out1.str();coutpstrendl;,【例11.30】使用字符串流输入,注意比较下述ss与cin,#include#includevoid m

49、ain()int a,a1;double b,b1;char c80,c180;char buf=1234 2.79n串;istrstream ss(buf);ssabc;couta1b1c1;couta1+b1,c1endl;,【例11.31】带字符串流长度的输入,比较s1与s2的区别,#include#includevoid main()char buf=12345yu;int i,j;istrstream s1(buf);/长度有8位 istrstream s2(buf,2);/长度只有2位/串流中不自动存放串结束符(0)s1i;s2j;couti,j,i+jendl;,11.7 流错误

50、处理,流类库中提供错误检测和处理机制。11.7.1 错误状态字和状态函数ios类中定义有记录错误的状态字和检测、设置、清除状态字的成员函数。ios的状态字常量有:goodbit=0 x00 表示无错状态 eofbit=0 x01 表示读写指针到达文件尾 failbit=0 x02 表示读写失败 badbit=0 x04 表示试图非法操作 hardbit=0 x08 表示出现致命错误,11.7.1 错误状态字和状态函数,ios中的状态函数有:int rdstate()返回当前错误状态字 int eof()提取操作到达流尾则返回非0,否则返回0 int fail()failbit位设置,返回非0,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号