第7章输入输出流_第1页
第7章输入输出流_第2页
第7章输入输出流_第3页
第7章输入输出流_第4页
第7章输入输出流_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

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

文档简介

1、 面向对象面向对象 第7章 输入输出流2主要内容主要内容n流流 n无格式输入无格式输入/ /输出输出n输入输入/ /输出的格式控制输出的格式控制n文件的输入文件的输入/ /输出输出3分析问题分析问题nC+C+没有定义任何用于执行输入或输出的没有定义任何用于执行输入或输出的语句,但可以使用语句,但可以使用C C语言中的标准语言中的标准I/OI/O函函数数printf()和和scanf()来解决此问题。来解决此问题。nprintf()与与scanf()存在两个缺点:存在两个缺点:n非类型安全非类型安全n不可扩充性不可扩充性 4nC+C+使用类型安全的使用类型安全的I/OI/O流操作。不同类流操作。

2、不同类型的型的I/OI/O流操作都是重载的,没有定义过流操作都是重载的,没有定义过I/OI/O功能的类型不具备功能的类型不具备I/OI/O操作的能力。操作的能力。nC+C+标准库既可作为标准数据类型数据的标准库既可作为标准数据类型数据的I/OI/O,也能用于自定义类型的对象的,也能用于自定义类型的对象的I/OI/O,这种扩展性是这种扩展性是C+C+最有价值的特点之一。最有价值的特点之一。 nC+C+用输入输出流来解决这个问题。用输入输出流来解决这个问题。5流流 n所谓流所谓流(stream)是指数据从一个位置是指数据从一个位置流向另一个位置。流是字节的序列。流向另一个位置。流是字节的序列。n输

3、入输出是一种数据传递操作,可以输入输出是一种数据传递操作,可以看作字符序列在计算机内存与外设之间看作字符序列在计算机内存与外设之间的流动,的流动,C+C+将数据从一个对象到另一个将数据从一个对象到另一个对象的流动抽象为对象的流动抽象为“流流”。流动的方向。流动的方向不同,构成输入不同,构成输入/ /输出流,即输出流,即I/OI/O流。流。6I/OI/O流流 n在在C+C+程序中,数据可以从键盘流入到程程序中,数据可以从键盘流入到程序,也可以从程序流向屏幕或磁盘文件。序,也可以从程序流向屏幕或磁盘文件。从流中获取数据的操作称为从流中获取数据的操作称为提取操作提取操作,向流中添加数据的操作称为向流

4、中添加数据的操作称为插入操作插入操作。n数据的输入数据的输入/ /输出就是通过输出就是通过I/OI/O流来实现流来实现的。的。7编译系统已经以编译系统已经以运算符或函数运算符或函数的形式做好了对标的形式做好了对标准外设准外设(键盘、屏幕、打印机、(键盘、屏幕、打印机、文件文件)的接口,的接口,使用时只需按照要求的格式调用即可。使用时只需按照要求的格式调用即可。cinx; coutx;内内存存键盘键盘文件文件光笔光笔.输入流输入流显示器显示器文件文件打印机打印机.输出流输出流8I/OI/O流类库的层次结构流类库的层次结构 nC+C+编译系统提供的编译系统提供的I/OI/O流类库含有两个流类库含有

5、两个平行基类:平行基类:nstreambufstreambufniosiosniosios类有类有4 4个直接派生类个直接派生类: :n输入流类输入流类istreamistreamn输出流类输出流类ostreamostreamn文件流类文件流类fstreambasefstreambasen串流类串流类strstreambasestrstreambase9I/OI/O流类库的头文件流类库的头文件 niostream:iostream:I/OI/O流类库的最主要的头文件,它包流类库的最主要的头文件,它包括操作所有括操作所有I/OI/O所需的基本信息,还包括所需的基本信息,还包括cincin、cou

6、tcout、cerrcerr和和clogclog共共4 4个对象。个对象。niomanip:iomanip:包含带参数的流操纵算子的有关信息。包含带参数的流操纵算子的有关信息。nfstream:fstream:包含对文件包含对文件I/OI/O操作的有关信息。操作的有关信息。nstrstream:strstream:包含对内存格式化包含对内存格式化I/OI/O操作的有关操作的有关信息。信息。nstdiostream:stdiostream:包含混合使用包含混合使用C C和和C+C+风格的风格的I/OI/O操作的有关信息。操作的有关信息。10int main() float a,b,c,disc;

7、 coutabc; if(a=0) cerr“a is equal to zero,error!”endl; else if(disc=b*b-4*a*c)0) cerr “disc=b*b-4*a*c0”endl; else cout“x1=”(-b+sqrt(disc)/(2*a)endl; cout“x2=”(-b-sqrt(disc)/(2*a)endl;return 0;1: please input a,b,c: 0 2 3 a is equal to zero,error!2:please input a,b,c: 5 2 3 disc=b*b-4*a*c03:please in

8、put a,b,c: 1 2.5 1.5 x1=-1 x2=-1.511无格式输入无格式输入/ /输出输出 n无格式输入无格式输入/ /输出就是按系统预定义的格式进输出就是按系统预定义的格式进行的输入行的输入/ /输出。输出。n按默认约定,每个按默认约定,每个C+C+程序都能使用标准程序都能使用标准I/OI/O流,如标准输入、标准输出。流,如标准输入、标准输出。ncincin用来处理标准输入,即键盘输入;用来处理标准输入,即键盘输入;coutcout用来处用来处理标准输出,即屏幕输出。它们被定义在理标准输出,即屏幕输出。它们被定义在iostreamiostream头文件中。头文件中。n在使用在

9、使用coutcout和和cincin前,要用编译预处理命令将所使前,要用编译预处理命令将所使用的头文件包含到源程序中,其格式如下:用的头文件包含到源程序中,其格式如下:#include #include 12无格式输出无格式输出 n“”“”是预定义的插入运算符,作用在流类对是预定义的插入运算符,作用在流类对象象coutcout上,实现默认格式的屏幕输出。使用上,实现默认格式的屏幕输出。使用coutcout输出表达式值到屏幕上的格式如下:输出表达式值到屏幕上的格式如下:coutEcoutE1 1EE2 2EEm m; ; 其中,其中,E E1 1、E E2 2、E Em m为均为表达式。为均为表

10、达式。n用用“coutcout”是预定义的提取运算符,作用在流类对象是预定义的提取运算符,作用在流类对象cincin上,实现默认格式的键盘输入。使用上,实现默认格式的键盘输入。使用cincin将数将数据输入到变量的格式如下:据输入到变量的格式如下:cinV1V2Vn; 其中,其中,V V1 1、V V2 2、V Vn n都是变量。功能是暂停执行都是变量。功能是暂停执行程序,等待用户从键盘输入数据,各数据间用空程序,等待用户从键盘输入数据,各数据间用空格或格或TabTab键分隔,输入数据类型要与接受变量类型键分隔,输入数据类型要与接受变量类型一致,输完后,按回车键结束。一致,输完后,按回车键结束

11、。15无格式输入无格式输入 ncin是是istream流类的对象,它在流类的对象,它在iostream头文件中作为全局对象定义,头文件中作为全局对象定义,其格式如下:其格式如下: istream cin(stdin); 标准输入设备标准输入设备名(键盘)名(键盘)16输入输出的格式控制输入输出的格式控制 nC+C+提供了两种格式化输入提供了两种格式化输入/ /输出方式输出方式: :n一种是用流对象的有关成员函数进行格一种是用流对象的有关成员函数进行格式化输入输出式化输入输出n另一种是用专门的控制符进行格式化输另一种是用专门的控制符进行格式化输入输出入输出17 用流对象的成员函数格式化用流对象的

12、成员函数格式化 n流成员函数主要是通过对状态标志、输出宽度、流成员函数主要是通过对状态标志、输出宽度、填充字符以及输出精度的操作来完成输入填充字符以及输出精度的操作来完成输入/ /输输出格式化。出格式化。n输入输入/ /输出的格式由各种状态标志来确定,在输出的格式由各种状态标志来确定,在iosios类中定义为枚举量。类中定义为枚举量。n枚举量定义在枚举量定义在iosios类中,因此引用时必须包含类中,因此引用时必须包含ios:ios:前缀。使用时应该全部用符号名,绝不前缀。使用时应该全部用符号名,绝不要用数值。要用数值。18用流对象的成员函数对状态标志进行操作用流对象的成员函数对状态标志进行操

13、作 niosios类有类有3 3个成员函数可以对状态标志进个成员函数可以对状态标志进行操作,并且定义了一个行操作,并且定义了一个longlong型数据成型数据成员记录当前状态标志。这些状态标志可员记录当前状态标志。这些状态标志可用位或运算符用位或运算符“| |”进行组合。进行组合。 n用用setfsetf函数设置状态标志,函数设置状态标志, 其一般格式其一般格式如下:如下:long ios:long ios:setfsetf(long flags)(long flags)19用流对象的成员函数对状态标志进行操作用流对象的成员函数对状态标志进行操作n清除状态标志清除状态标志用用unsetfuns

14、etf函数清除状态标志,其一般格式函数清除状态标志,其一般格式如下:如下:long ios:long ios:unsetfunsetf(long flags)(long flags)20用流对象的成员函数对状态标志进行操作用流对象的成员函数对状态标志进行操作n用函数用函数flagsflags取状态标志有两种形式,其取状态标志有两种形式,其格式分别如下:格式分别如下:long ios:flags() /返回与流相关的当前状态标志值返回与流相关的当前状态标志值long ios:flags(long flag)/将流的状态标志值设置为将流的状态标志值设置为flagflag,并返回,并返回设置前的状态

15、标志值。设置前的状态标志值。21用流对象的成员函数对状态标志进行操作用流对象的成员函数对状态标志进行操作n以上三组函数必须用流类对象(以上三组函数必须用流类对象(cincin或或coutcout)来调用,其格式如下:)来调用,其格式如下: .(ios:(ios:) cout.setf(ios:showpos); cout.setf(ios:scientific); cout.setf(ios:showpos| ios:scientific);22000000100000000100110010001000010010001000100001001000100010000100001000000

16、00000void showflags(long f);int main() long f; f=cout.flags(); /取当前状态标志取当前状态标志 showflags(f); /显示状态值显示状态值 cout.setf(ios:showpos|ios:scientific|ios:fixed); /追加状态标志追加状态标志 f=cout.flags(); /取当前状态标志取当前状态标志 showflags(f); /显示状态值显示状态值 cout.unsetf(ios:scientific); /从状态标志中去掉从状态标志中去掉 scientific f=cout.flags();

17、/取当前状态标志取当前状态标志 showflags(f); /显示状态值显示状态值 f=cout.flags(ios:hex); /重新设置状态标志重新设置状态标志 showflags(f); f=cout.flags(); /取当前状态标志取当前状态标志 showflags(f); return 0;void showflags(long f) long i; for(i=0 x8000;i;i=i1) /用右移方式使用右移方式使i中的值为中的值为1的位不断右移的位不断右移 if(i&f)cout1; /判断判断f中的某一位是否为中的某一位是否为1 else cout0; coute

18、ndl;【例例】示例对状态标志的操作。示例对状态标志的操作。23用流对象的成员函数设置输出宽度用流对象的成员函数设置输出宽度n设置输出宽度函数有两种形式,其格式分别设置输出宽度函数有两种形式,其格式分别如下:如下: int ios:width(int len) int ios:width()n第一种形式是设置输出宽度,并返回原来的第一种形式是设置输出宽度,并返回原来的输出宽度;第二种形式是返回当前输出宽度,输出宽度;第二种形式是返回当前输出宽度,默认输出宽度为默认输出宽度为0 0。n只对其后的第一个输出项有效。只对其后的第一个输出项有效。24设置填充字符设置填充字符n填充字符的作用是当输出值不

19、满输出宽度时填充字符的作用是当输出值不满输出宽度时用填充字符来填充,默认填充字符为空格。用填充字符来填充,默认填充字符为空格。它与它与width()width()函数配合使用,否则没有意义。函数配合使用,否则没有意义。n设置填充字符函数有两种形式,其格式分别设置填充字符函数有两种形式,其格式分别如下:如下: char ios:fill(char ch) char ios:fill()n第一种形式是重新设置填充字符,并返回设第一种形式是重新设置填充字符,并返回设置前的填充字符;第二种形式是返回当前的置前的填充字符;第二种形式是返回当前的填充字符填充字符。25设置输出精度设置输出精度 n设置浮点数

20、输出精度有两种形式,其设置浮点数输出精度有两种形式,其格式分别如下:格式分别如下: int ios:precision(int p) int ios:precision()n第一种形式是重新设置输出精度,并第一种形式是重新设置输出精度,并返回设置前的输出精度;第二种形式返回设置前的输出精度;第二种形式是返回当前的输出精度。默认输出精是返回当前的输出精度。默认输出精度为度为6 。26n以上三组函数必须用流类对象(以上三组函数必须用流类对象(cincin或或coutcout)来调用。)来调用。27width:0 8(new width)filling word is: (ASCII code32)

21、*(42)(new filling word)precision:6123.45679(example)8(new precision)int main()int i;i=cout.width();coutwidth:iendl;cout.width(8);coutcout.width()(new width)endl;char c;c=cout.fill();coutfilling word is:c(ASCII code(int)c)endl;cout.fill(*);coutcout.fill()(int)cout.fill()(new filling word)endl;int j;j

22、=cout.precision();coutprecision:jendl;cout.precision(8);cout123.456789(example)endl;coutcout.precision()(new precision)”或插入运算符或插入运算符“”后面来后面来设定输入设定输入/ /输出格式输出格式,即在读写对象之间,即在读写对象之间插入一个修改状态的操作。插入一个修改状态的操作。 29n设置输入设置输入/ /输出宽度输出宽度setw(int)setw(int)n用整型参数来制定输入用整型参数来制定输入/ /输出域的宽度。使用输出域的宽度。使用时只对其后一项输入时只对其后一项

23、输入/ /输出有效。输出有效。n当用于输出时,若实际宽度小于设置宽度时,当用于输出时,若实际宽度小于设置宽度时,数据向右对齐,反之则按数据的实际宽度输出。数据向右对齐,反之则按数据的实际宽度输出。n当用于输入时,若输入的数据宽度超过设置宽当用于输入时,若输入的数据宽度超过设置宽度时,超出的数据部分被截断而被作为下一项度时,超出的数据部分被截断而被作为下一项输入内容。输入内容。 3012345 678123456781234512345i:10#include #include using namespace std;int main() char *p=12345,*q=678; char f

24、4,g4; /最后一位为最后一位为0 int i=10; coutpsetw(6)qsetw(4)pqsetw(4)fg; /设置输入宽度设置输入宽度 coutfendlgendli:iendl; return 0;【例例】用控制符示例设置输入用控制符示例设置输入/输出宽度输出宽度31n设置输出填充字符设置输出填充字符setfill(char)setfill(char)n与与ios:fillios:fill相同,常与相同,常与setw(int)setw(int)联合使用,从而向联合使用,从而向不满设置输出宽度的空间填入指定的字符,不设置则不满设置输出宽度的空间填入指定的字符,不设置则填空格。填

25、空格。n设置后直至下一次设置前一直有效。设置后直至下一次设置前一直有效。n参数可以是字符常量或字符变量。参数可以是字符常量或字符变量。 n设置输出精度设置输出精度setprecision(int)setprecision(int)n指明输出实数的有效位数。指明输出实数的有效位数。n参数为参数为0 0时,按默认有效位数时,按默认有效位数6 6输出。输出。n在以在以fixedfixed形式和形式和scientificscientific形式输出时参数为小数位形式输出时参数为小数位数。数。 32nsetiosflags(ios:fixed)用定点方式表示实数。用定点方式表示实数。nsetiosfla

26、gs(ios:scientific)用科学记数法方式表用科学记数法方式表示实数。示实数。n如果如果setprecision(n)setprecision(n)与与setiosflags(ios:fixed)合用,合用,可以控制小数点右边的数字个数。可以控制小数点右边的数字个数。n如果如果setprecision(n)setprecision(n)与与setiosflags(ios:scientific)合合用,可以控制科学记数法中尾数的小数位数。用,可以控制科学记数法中尾数的小数位数。 nsetiosflags(ios:left)输出数据左对齐输出数据左对齐nsetiosflags(ios:r

27、ight)输出数据右对齐输出数据右对齐33nsetiosflags(ios:uppercase)大写表示大写表示nsetiosflags(ios:showpos)输出正数时给出输出正数时给出“+”号号nsetiosflags(ios:skipws)忽略前导空格忽略前导空格nresetiosflags()终止已设置的输出格式状终止已设置的输出格式状态,在括号中应指定内容态,在括号中应指定内容34Zoot 1.23Jimmy 35.36Al 653.7Stan 4358.24#include #include using namespace std; int main() double value

28、s=1.23,35.36,653.7,4358.24;char *names=Zoot,Jimmy,Al,Stan;for(int i=0;i4;i+) coutsetiosflags(ios:left) /设置左对齐设置左对齐 setw(6)namesi resetiosflags(ios:left) /取消左对齐取消左对齐 setw(10)valuesi endl; return 0;【例例】设置对齐方式和输出宽度示例设置对齐方式和输出宽度示例353.142863.143.14285714 #include #include using namespace std;int main() d

29、ouble f=22.0/7; /在用浮点形式表示的输出中,在用浮点形式表示的输出中,setprecision(n)表示实数的有效位数表示实数的有效位数 coutfendl; /默认有效位数为默认有效位数为6 coutsetprecision(3)fendl; /设置有效位数为设置有效位数为3/在用定点形式表示的输出中,在用定点形式表示的输出中,setprecision(n)表示实数的小数位数表示实数的小数位数 coutsetiosflags(ios:fixed); coutsetprecision(8)fendl; /小数位数为小数位数为8 return 0;【例例】分别用浮点、定点的方式表

30、示一个实数分别用浮点、定点的方式表示一个实数coutsetprecision(8);coutsetiosflags(ios:scientific)fendl; /尾数小数位数为83.14285714e+000 36n设置输入设置输入/ /输出整型数数制输出整型数数制decdec、hexhex和和octoct。n控制换行的控制符控制换行的控制符endlendl n代表输出单字符代表输出单字符“00”的控制符的控制符endsends37用户自定义控制符函数用户自定义控制符函数n建立输出控制符函数的格式如下:建立输出控制符函数的格式如下: ostream& manip_name(ostrea

31、m& stream) return stream;控制符函数名控制符函数名38#include #include using namespace std;ostream& setup(ostream& stream) stream.setf(ios:left); streamsetw(10)setfill($); return stream;int main() cout10 setup10endl; return 0;【例例】 示例用户自定义输出控制符函数示例用户自定义输出控制符函数10 10$ 39用户自定义控制符函数用户自定义控制符函数n建立输入控制符函数的格式如

32、下:建立输入控制符函数的格式如下: istream& manip_name(istream& stream) return stream;操作符函数名操作符函数名40#include #include using namespace std;istream& prompt(istream& stream) cinhex; coutprompti; coutixcoutxoutfilex程序对文本文件的操作与对键盘、显示器的操作程序对文本文件的操作与对键盘、显示器的操作比较:比较:在涉及在涉及文本文件文本文件的操作时,将输入文件看成键盘,的操作时,将输入文件看成键

33、盘,将输出文件看成显示器,格式不变。将输出文件看成显示器,格式不变。只需在程序中只需在程序中增加打开与关闭文件的语句。增加打开与关闭文件的语句。45C+C+中进行文件操作的一般步骤中进行文件操作的一般步骤 n为文件为文件定义定义一个流类对象;一个流类对象;n使用使用open()open()函数建立(或打开)文件。如果文函数建立(或打开)文件。如果文件不存在,则建立该文件;如果磁盘上已存在件不存在,则建立该文件;如果磁盘上已存在该文件,则打开该文件;该文件,则打开该文件;n进行进行读写读写操作。在建立(或打开)的文件上执操作。在建立(或打开)的文件上执行所要求的输入行所要求的输入/ /输出操作。

34、一般来说,在内输出操作。一般来说,在内存与外设的数据传输中,由内存到外设称为输存与外设的数据传输中,由内存到外设称为输出或写,反之则称为输入或读;出或写,反之则称为输入或读;n使用使用close()close()函数关闭文件。当完成操作后,函数关闭文件。当完成操作后,应把打开的文件关闭,避免误操作。应把打开的文件关闭,避免误操作。46n在在C+C+中,打开一个文件就是将这个文件与一个中,打开一个文件就是将这个文件与一个流建立关联;关闭一个文件就是取消这种关联。流建立关联;关闭一个文件就是取消这种关联。nopen()函数的原型在函数的原型在fstream中定义。其原型中定义。其原型为:为:voi

35、d open(char *filename,int mod,int access);n其中第一个参数是用来传递文件名;第二个参数其中第一个参数是用来传递文件名;第二个参数的值决定文件的使用方式;第三个参数的值决定的值决定文件的使用方式;第三个参数的值决定文件的访问方式。文件的访问方式。n对于对于ifstream流类,流类,mod的值为的值为ios:in;对于对于ofstream流类,流类,mod的值为的值为ios:out47n打开文件打开文件n先建立流对象,然后调用函数先建立流对象,然后调用函数open连接外部文件连接外部文件 流类流类 对象名对象名; 对象名对象名.open(文件名文件名,方

36、式方式);n调用流类带参数的构造函数,建立流对象的同时连调用流类带参数的构造函数,建立流对象的同时连接外部文件接外部文件 流类流类 对象名对象名(文件名文件名,方式方式); 其中,其中,“流类流类” 为为ifstream、ofstream或或fstream。文件的打开与关闭48n关闭文件关闭文件n使用使用close()成员函数进行关闭:成员函数进行关闭: 流对象名流对象名. close() 其中,流对象名是待关闭的文件流的对象其中,流对象名是待关闭的文件流的对象名。名。文件的打开与关闭49120,310.85#include #include using namespace std;int m

37、ain()ofstream ostrm; /定义流类对象定义流类对象ostrm.open(f1.dat); /打开文件打开文件ostrm120endl; /写操作写操作ostrm310.85nd; /读操作读操作coutn,dendl;istrm.close(); /关闭文件关闭文件 return 0;【例例】 示例文件的输入示例文件的输入/输出操作。输出操作。50n文本文件的读写:文本文件用默认方式打开。文本文件的读写:文本文件用默认方式打开。文件的读写#include #include using namespace std;int main() char s180,s28; fstrea

38、m outfile; cins1; outfile.open(exam.txt,ios:out);if(!outfile) coutexam.txt cant openendl; abort();outfiles2;couts2endl;outfile.close();return 0;51n二进制文件的读写二进制文件的读写n若在文件的打开方式中没有特别说明,打开的文件均为若在文件的打开方式中没有特别说明,打开的文件均为ASCIIASCII码文件,码文件,若要打开二进制文件,则要特别说明并用特定的读写若要打开二进制文件,则要特别说明并用特定的读写函数函数。n二进制文件用二进制文件用binary

39、binary方式打开,读写方式完全由程序控制。方式打开,读写方式完全由程序控制。fstream infile,outfile;infile.open(“inf1.dat”, ios:in| ios:binary);outfile.open(“outf1.dat”, ios:out| ios:binary); 文件名文件名 输入方式打开输入方式打开 二进制文件二进制文件 文件名文件名 输出方式打开输出方式打开 二进制文件二进制文件文件的读写52输入函数:输入函数:infile.read( char *, int )输入文件输入文件对象名对象名 数据进入的内存地址数据进入的内存地址 一次读入的字节

40、数一次读入的字节数int a10;infile.read(char *)a, 10*sizeof(int);/从文件中输入十个整型数到从文件中输入十个整型数到aint i;infile.read(char *)&i, sizeof(int);/从文件中输入一个整型数到从文件中输入一个整型数到i由于二进制文件中的数据不是由于二进制文件中的数据不是ASCIIASCII码,故不能直接对码,故不能直接对其读写,其读写,必须要通过特定的函数予以转换。必须要通过特定的函数予以转换。文件文件内存内存读入读入地址要强制转换成字符型地址要强制转换成字符型53输出文件输出文件对象名对象名 要输出的数据在内

41、存中的地址要输出的数据在内存中的地址 一次输出的字节数一次输出的字节数int a10=0,1,2,3,4,5,6,7,8,9;outfile.write(char *)a, 10*sizeof(int);/向文件输出一个整型数组向文件输出一个整型数组aint i=4;outfile.write(char *)&i, sizeof(int);/向文件输出一个整型数向文件输出一个整型数i输出函数:输出函数:outfile.write( char *, int )文件文件内存内存写出写出地址要强制转换成字符型地址要强制转换成字符型54【例例】 二进制文件的读写二进制文件的读写struct p

42、ersonchar name20; double height; unsigned short age;people3= wang,1.65,25, zhang,1.78,24, li,1.85,21;int main() fstream infile,outfile; outfile.open(exam.dat,ios:out|ios:binary); if(!outfile) coutexam.dat cant openendl; abort(); for(int i=0;i3;i+) outfile.write(char*)&peoplei,sizeof(peoplei); ou

43、tfile.close(); infile.open(exam.dat,ios:in|ios:binary); if(!infile) coutexam.dat cant openendl; abort(); for(int j=0;j3;j+) infile.read(char*)&peoplej,sizeof(peoplej); tpeoplej.heighttpeoplej.ageendl; infile.close(); return 0;55n文件的随机读写:文件的随机读写:文件打开以后,系统自动生成两文件打开以后,系统自动生成两个隐含的流指针

44、个隐含的流指针:读指针和写指针。在输入文件流类读指针和写指针。在输入文件流类中,有关读指针的函数如下:中,有关读指针的函数如下:n移动读指针移动读指针函数函数nistream& istream:seekg(streampos pos); 该函数的功能是将输入文件的指针移动到该函数的功能是将输入文件的指针移动到pospos指指定的位置中。定的位置中。文件的读写56nistream& istream:seekg(streamoff offset,seek_dir origin);其中,其中,origin的类型的类型seek_dir是一个枚举类型,有以是一个枚举类型,有以下三种取值:

45、下三种取值:ios:beg 表示指针的起始位置为文件头表示指针的起始位置为文件头ios:cur 表示指针的起始位置为当前位置表示指针的起始位置为当前位置ios:end 表示指针的起始位置为文件尾表示指针的起始位置为文件尾该函数的功能是从该函数的功能是从origin指定的开始位置起,将文件指定的开始位置起,将文件指针移动指针移动offset个字节数。个字节数。文件的读写57n返回读指针当前指向的位置值返回读指针当前指向的位置值streampos istream:tellg( );该函数的功能是确定文件指针的当前位置。该函数的功能是确定文件指针的当前位置。文件的读写58n相应地,相应地,ostream类提供有关写指针的函数如下:类提供有关写指针的函数如下:n移动写指针函数移动写指针函数nostream& ostream:seekp(streampos pos);nostream& ostream:seekp(streamoff offset,seek_dir origin);n返回写指针当前指向的位置值返回写指针当前指向的位置值nstreampos ostream:tellp( ); 函数参数的意义与读指针函数一样。函数参数的意义与读指针函数一样。文件的读写59【例例】 文件的随机读写文件

温馨提示

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

评论

0/150

提交评论