C++语言对文件的操作_第1页
C++语言对文件的操作_第2页
C++语言对文件的操作_第3页
C++语言对文件的操作_第4页
C++语言对文件的操作_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

第11章C++语言的I/O流类库本章的最主要目的就是把对象保存到磁盘文件中并从磁盘文件重建对象。当然C++可完成更多的任务。C++语言中并没有输入/输出语句,而是在标准库里包含了一个I/O流类库,它与标准模板库同为C++标准库中最重要的组成局部。数据从一个对象到另一个对象的传送被抽象为“流”。数据的输入/输出就是通过输入/输出流来实现的。流是一种抽象的概念,负责在数据的产生者和数据的使用者之间建立联系,并管理数据的流动。常用的读写操作屏幕输出操作1.使用预定义的插入符<<<<是左移位运算符的重载,格式为:字符流目的地<<字符流内容需在屏幕显示时,屏幕就是字符流目的地,头文件iostream.h中定义有ostream类的全局对象cout就代表屏幕。使用<<时应注意运算符的优先级别,必要时,用加括弧的方法保证其他运算符优先运算,例如:cout<<(i>j?i:j)<<endl;如果不加(),将因运算顺序不对而编译出错。【例11.1】插入符用法例如#include<iostream.h>#include<string.h>intmain(){cout<<"字符串\"Thisisastring.\"的长度为:";cout<<strlen("Thisisastring.")<<endl;cout<<"字符串\"Thisisastring.\"占的空间为:";cout<<sizeof("Thisisastring.")<<endl;system("pause");return0;}运行结果为17和18,因为strlen是求字符串的长度,即字符串中字符的个数;sizeof是求占用内存的字节数,其中包括字符串结束标志空字符占用的内存。strlen在string.h中定义,sizeof是一个运算符。【例11.2】输出变量地址值例如#include<iostream.h>intmain(){intx(100);int*px=&x;cout<<"x="<<x<<"\n十进制&x="<<long(&x)<<endl;cout<<"*px="<<*px<<"\n十进制px="<<long(px)<<endl;cout<<"*px="<<*px<<"\n十进制&px="<<long(&px)<<endl;cout<<"*px="<<*px<<"\n十六进制&px="<<&px<<endl;system("pause");return0;}运行结果显示直接输出地址值时是十六进制,假设要以十进制显示需做强制类型转换为长整型。【例11.3】编写判断除数为0的整数除法程序#include<iostream.h>voidfun(inti,intj){if(j)cout<<"商为:"<<i/j<<endl;elsecout<<"除数为0,不能求商!\n";}intmain(){intx,y;for(inti=0;i<3;i++){

cout<<"输入被除数和除数:";cin>>x>>y;fun(x,y);}system("PAUSE");return0;}请仔细阅读本程序。11.2.2键盘输入操作1.使用预定义的提取符>>>>是右移位运算符的重载,格式为:输入流源头>>输入流目的地需从键盘接收数据时,键盘就是输入流源头,输入流目的地应是变量名,头文件iostream.h中定义有istream类的全局对象cin就代表键盘。提取符>>依次从输入源中提取一个数据项,连续提取时,数据项之间用空格、制表符、换行等空白符分隔。如对语句cin>>x>>y>>z;可键入:181920<回车>1.使用预定义的提取符>>标准设备(键盘)输入是最不平安的,注意以下几点,可以防止错误:①cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取时,是从缓冲区中拿。如果一次输入过多,会留在那儿慢慢用,如果输入错了,必须在回车之前修改,如果回车键按下就无法挽回了。只有把输入缓冲区中的数据取完后,才要求输入新的数据。不可能用刷新来去除缓冲区,所以不能输错,也不能多输!②输入的数据类型必须与要提取的数据类型一致,否那么出错,出错只是在流的状态字state〔枚举类型io_state〕中对应位置位〔置1〕,程序继续。所以要提高健壮性,就必须在编程中参加对状态字state的判断。③空格和回车都可以作为数据之间的分格符,所以多个数据可以在一行输入,也可以分行输入。但如果是字符型和字符串,那么空格〔ASCII码为32〕无法用cin输入,字符串中也不能有空格。回车符也无法读入。【例11.6】提取符用法例如#include<iostream.h>intmain(){intx,y;cout<<"请输入两个整数:";

cin>>x>>y;cout<<'('<<x<<','<<y<<")\n";}3.使用成员函数getline()输入一行字符

getline函数原型是:

istream&getline(char*buf,intn,charch='\n');

功能是最多提取n-1个字符放在buf为首地址的缓冲区中,参数ch为终止符,隐含的终止符为换行符。

使用getline函数从键盘提取字符串的格式为:

cin.getline(字符指针,整数n,终止界定符)

输入字符少于n-1时,接收实际输入字符数,并将缓冲区的回车符去除,假设输入字符数不少于n-1时,多余的字符及回车符留在缓冲区。该函数不能接受换行字符('\n')。该函数终止读取字符的条件为:

①读取n-1个字符

②遇到参数指定的终止符

③遇到文件结束符(Ctrl+Z)或回车符。【例11.10】输入假设干行字符,求出最长行的字符个数及输入行数。使用成员函数getline()#include<iostream.h>constintSIZE=80;intmain(){charbuf[SIZE];intlcnt=0,lmax=-1;cout<<"输入假设干行字符:";while(cin.getline(buf,SIZE))//用Ctrl+Z作输入流结束标志{intcount=cin.gcount();//gcount计算刚刚用getline函数输入的字符数的成员函数lcnt++;if(count>lmax)lmax=count;cout<<"line#"<<lcnt<<':'<<count<<endl;cout.write(buf,count).put('\n').put('\n');}cout<<endl;cout<<"最长行字符数:"<<lmax<<endl;cout<<"总行数:"<<lcnt<<endl;}4.使用成员函数read()输入一行字符

read函数原型是:

istream&read(char*buf,intn);

功能是最多提取n-1个字符放在buf为首地址的缓冲区中

使用read函数从键盘提取字符串的格式为:

cin.getline(字符指针,整数n)

最多接收n个字符,接受字符中可以包括换行符('\n')。该函数终止读取字符的条件为:

①读取n个字符

②遇到文件结束符(Ctrl+Z)。【例11.11】输入假设干行字符,并输出。使用成员函数read()。#include<iostream.h>intmain(){constintSIZE=80;charbuf[SIZE]="";cout<<"输入假设干行字符:\n";cin.read(buf,SIZE);cout<<endl;cout<<buf<<endl;}运行该程序,比较>>、read、get、getline四种读取字符方法的异同(终止条件、可接受字符的范围、可接受字符的多少、使用格式、是否缓冲等)。11.3格式化输入输出操作1.控制格式的标志位定义为公有的无名的枚举类型:enum{skipws=0x0001,//跳过输入中的空白字符left=0x0002, //输出左对齐right=0x0004, //输出右对齐internal=0x0008, //在输出符号或数字字符后填充dec=0x0010, //在输入输出时将数据按十进制处理oct=0x0020, //在输入输出时将数据按八进制处理hex=0x0040, //在输入输出时将数据按十六进制处理showbase=0x0080, //在输出时带有表示数制基的字符

C++在类ios中提供格式化输入输出,有两种方法控制输入输出格式:一是使用标志位和成员函数,二是使用控制符。11.3.1使用成员函数进行格式输出11.3 格式化输入输出操作showpoint=0x0100,//输出浮点数时,必定带小数点uppercase=0x0200, //输出十六进制,用大写字母showpos=0x0400, //输出正数时,加”+”号scientific=0x0800, //科学计数方式输出浮点数fixed=0x1000, //定点数方式输出实数unitbuf=0x2000, //插入后,立即刷新流的缓冲区stdio=0x4000} //插入后,立即刷新stdout和stderr该枚举量说明中每一个枚举量实际对应两字节数据〔16位〕中的一个位,所以可以同时采用几个格式控制,只要把对应位置1即可,这样既方便又节约内存。取多种控制时,用或“|”运算符来合成,合成为一个长整型数,在ios中为:protected: longx_flags;这个长整型数据成员被称为标志字。11.3输入输出的格式控制类ios中还设置了三个输入输出流格式控制标志:protected:intx_precision;//标志浮点数精度,缺省为6位intx_width;//输出域宽,缺省域宽为0,//重设域宽只对其后第一输出项有效,如域宽缺乏,那么不受限制charx_fill;//标志域宽有充裕时填入的字符2.设置标志字的成员函数①longflags()返回标志字函数。②longflags(long)

函数值为更新前的标志字,参数作更新后的标志字③longsetf(longsetbits,longfield)

该函数先将第二个参数(转换为二进制)中为1的标志位置0,再将第一个参数(转换为二进制)中为1的标志位置1。函数值为设置前标志字。④longsetf(long)设置参数(转换为二进制)中为1的标志位置1,其余标志位不变。函数值未设置前的标志字。⑤longunsetf(long)设置参数(转换为二进制)中为1的标志位置0,其余标志位不变。函数值未设置前的标志字。在ios中定义有如下静态整型常量:①staticconstlongadjustfield;其值=left|right|internal=0x2|0x4|0x8=0xe②staticconstlongbasefield;其值=dec|oct|hex=0x10|0x20|0x40=0x70③staticconstlongfloatfield;其值=scientific|fixed=0x800|0x1000=0x1800实际上,上述3个组合设置是有矛盾的,如①中又要左对齐,又要右对齐是不可能的,自己可以编程测试实际结果,上述组合常用于去除标志位。例如,假设需去除数制标志后,再设置十六进制标志,可调用成员函数:cout.setf(ios::hex,ios::basefield)3.控制输出格式的成员函数IOS类中有如下控制输出格式的成员函数:①intwidth();intwidth(int);前者函数值为当前输出的数据宽度;后者参数为设置的数据输出宽度,函数值为设置前的数据输出宽度值;默认为实际需要的最少字符数,设置宽度小于默认值时,设置无效。②charfill();charfill(char);前者函数值为当前使用的填充字符;后者参数为设置的填充字符,函数值为设置前使用的填充字符;默认填充字符为空格。③intprecision();intprecision(int);前者函数值为当前使用的浮点数有效数字个数;后者参数为设置的浮点数有效数字个数,函数值为设置前使用的浮点数有效数字个数;单精度最多7位(默认6位)有效数字,双精度最多15位(默认6位)有效数字,长双精度最多19位(默认6位)有效数字。【例11.12】设置去除标志位的例子#include<iostream.h>intmain(){inta=1234;doubleb=12.345678;cout<<cout.flags()<<endl;

cout.setf(ios::hex,ios::basefield);cout<<cout.flags()<<endl;cout<<a<<endl;

cout.setf(ios::showbase);cout<<a<<endl;

cout.setf(ios::uppercase);cout<<a<<endl;

cout.setf(ios::oct,ios::basefield);cout<<a<<endl;longoldflag=cout.setf(ios::dec,ios::basefield);cout<<a<<endl;

cout.setf(ios::showpos);cout<<a<<endl;

cout.flags(oldflag);cout<<a<<endl;cout<<cout.flags()<<endl;cout<<b<<endl;

cout.setf(ios::scientific,ios::floatfield);cout<<b<<endl;cout<<cout.flags()<<endl;}//运行程序,观察结果。【例11.13】设置控制小数位数的例子#include<iostream.h>intmain(){doubled1=12.34567,d2=12.000;cout<<d1<<endl<<d2<<endl;cout.setf(ios::showpoint);cout<<d1<<endl<<d2<<endl;}运行程序,观察结果,注意:①默认的是可以不带小数点及小数局部的0②默认的有效数字是6位。【例11.14】设置输出对齐格式的例子#include<iostream.h>intmain()inti=12345;cout<<i<<endl;cout.width(10);cout.fill('#');

cout.setf(ios::left,ios::sdjustfield);cout<<i<<endl;

cout.setf(ios::right,ios::sdjustfield);cout<<i<<endl;cout.precision(6);doubled=123.456789;cout<<d<<endl;cout.setf(ios::scientific,ios::floatfield);cout<<d<<endl;cout<<"宽度:"<<cout.width();}运行程序,观察结果,注意①宽度设置一次有效,再次使用需重新设置,②设置有冲突时会怎模样?怎样研究这个问题?11.3.2使用控制符进行格式输出控制符又称操作子,是定义在头文件iomanip.h中的对象,可以直接插入到数据流中,被<<和>>操作。下表列出了VC++支持的操作子:【例11.15】按整数的不同基数设置输出格式的例子#include<iostream.h>#include<iomanip.h>intmain(){intn;cout<<"输入一个十进制整数:";cin>>n;

cout<<n<<"的十六进制形式为:"<<hex<<n<<endl;cout<<dec<<n<<"的八进制形式为:"<<oct<<n<<endl;cout<<dec<<n<<"的十进制形式为:"<<n<<endl;}运行程序,观察结果,注意进位制基数设置后永久有效,要改变必须重新设置。【例11.16】设置浮点数精度和填充符的例子#include<iostream.h>#include<iomanip.h>#include<math.h>intmain(){doublen=sqrt(3);for(inti=0;i<10;i++){cout<<setprecision(i)<<setw(12)<<setfill('*');cout<<n<<endl;}

}运行程序,观察结果,注意输出宽度、输出精度(有效数字位数)、填充字符等设置方法。【例11.17】利用设置填充符、宽度的方法输出菱形#include<iostream.h>#include<iomanip.h>intmain(){ for(inti=7;i>1;i--) { cout<<setfill('')<<setw(i)<<''<<setfill('*'); cout<<setw(15-2*i)<<'*'<<endl; }for(i=1;i<8;i++){cout<<setfill('')<<setw(i)<<''<<setfill('*'); cout<<setw(15-2*i)<<'*'<<endl;}}运行程序,观察结果,注意打印图形的算法研究,找各行字符个数的规律,注意与【例4.16】比较。11.4插入符(<<)与提取符(>>)的重载为了对类的对象进行插入及提取操作,可以编写重载函数实现插入符、提取符的重载。【例11.18】重载提取符和插入符,实现中国日期格式的输入输出。(类定义、重载运算符的友元函数定义)#include<iostream.h>classDate{public:Date(inty,intm,intd)

{Year=y;Month=m;Day=d;}

friendostream&operator<<(ostream&stream,Date&date);

friendistream&operator>>(istream&stream,Date&date);private:intYear,Month,Day;};ostream&operator<<(ostream&stream,Date&date){stream<<date.Year<<"年"<<date.Month<<"月"<<date.Day<<"日\n";returnstream;}istream&operator>>(istream&stream,Date&date){stream>>date.Year>>date.Month>>date.Day;returnstream;}【例11.18】重载提取符和插入符,实现中国日期格式的输入输出。(主函数定义)intmain(){Dated(2003,3,18);cout<<"当前日期是:"<<d<<"输入新日期:";cin>>d;cout<<"新日期:"<<d;}上述主程序中,有5个插入符(<<),有1个提取符(>>),这些符号中哪些使用了友元函数定义的运算符重载,如何区别是否重载?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.翻开文件①说明一个文件流对象,这又被称为内部文件:ifstream输入文件流对象名;//只可用于输入ofstream输出文件流对象名;//只可用于输出fstream输入输出文件流对象名;//既可用于输入又可用于输出②使用对象的成员函数open翻开文件:文件流对象名.open("文件名",翻开方式);此处的文件名必须是外存上的文件名(外部文件),必要时应指明路径,open函数的作用是在内部文件与外部文件之间建立联系。①、②两步可以和二而一,即用对象初始化时的构造函数代替open函数,如:ifstream输入文件流对象名("文件名",翻开方式)文件访问方式常量表(ios中定义的公有枚举常量)11.5.1文件的翻开和关闭操作文件流中三个翻开文件的成员函数(open)的原型为:voidifstream::open(constchar*,int=ios::in,int=filebuf::openprot);voidofstream::open(constchar*,int=ios::out,int=filebuf::opernprot);voidfstream::open(constchar*,int,int=filebuf::openprot);第一个参数为要翻开的磁盘文件名。第二个参数为翻开方式,有输入〔in〕、输出〔out〕等。第三个参数为指定翻开文件的保护方式,一般取缺省。例如:要新建磁盘文本文件file.txt,并置写状态,可如下进行:ofstreamoutfile;outfile.open("file.txt",ios::out);或者:ofstreamoutfile("file.txt",ios::out);或者:ofstreamoutfile;outfile.open("file.txt");或者:ofstreamoutfile("file.txt");11.5.1文件的翻开和关闭操作翻开文件也应该判断是否成功,假设成功,文件流对象值为非零值,不成功为0〔NULL〕,文件流对象值物理上就是指它的地址。下面是翻开一个文件的完整程序段:fstreamiofile("myfile.txt",ios::in|ios::out);if(!iofile){cout<<"不能翻开文件:"<<"myfile.txt"<<endl;exit(1);}//失败退回操作系统2.关闭文件操作关闭文件将清理与翻开的文件有关的内存与外存,这样即可减少内存负担又可保证文件信息平安。关闭文件使用成员函数close进行:文件流对象名.close();//文件流对象名就是内部文件名。 11.5.2文本文件的读写操作

【例11.19】使用插入符向文本文件中写信息#include<iostream.h>//定义标准输出流对象cout#include<fstream.h>//定义文件流类fstream#include<stdlib.h>//定义abort函数intmain(){fstreamoutfile;outfile.open("file1.dat",ios::out);if(!outfile){cout<<"file1.dat打不开!\n";abort();}outfile<<"这是一个程序。\n"<<"这是一个字符串。\nok";outfile.close();}①注意分析程序中的3个插入符(<<)的作用②注意3个包含文件的作用③注意该程序的运行结果如何检验④函数abort()的作用。【例11.20】使用成员函数getline将文本文件file1.dat中的信息读出并显示在屏幕上。#include<iostream.h>//定义标准输出流对象cout#include<fstream.h>//定义文件流类ifstream#include<stdlib.h>//定义abort函数intmain(){ifstreaminfile("file1.dat");if(!infile){cout<<"file1.dat打不开!\n";abort();}chars[80];while(!infile.eof()){infile.getline(s,sizeof(s));cout<<s<<endl;}infile.close();}注意,①定义内部文件与翻开文件的格式与例19的区别②循环条件的含义③读取文件信息是否可用提取符?【例11.21】使用成员函数get、put读写文本文件。#include<iostream.h>//定义标准输出流对象cout#include<fstream.h>//定义文件流类fstream#include<stdlib.h>//定义abort函数#include<string.h>//定义strlen函数intmain(){fstreaminfile,outfile("file2.dat",ios::out);if(!outfile){cout<<"file2.dat打不开!\n";abort();}chars[]="我喜欢C++程序设计。";for(inti=0;i<=(int)strlen(s);i++)outfile.put(s[i]);outfile.close();infile.open("file2.dat",ios::in);if(!infile){cout<<"file2.dat打不开!\n";abort();}charch;while(infile.get(ch))cout.put(ch);cout<<endl;infile.close();}注意,该程序中共有几个内部文件?有几个外部文件?内外如何对应?用操作系统的方法如何显示本程序产生的外部文件?【例11.22】编程拷贝文本文件,使用成员函数get、put读写。#include<iostream.h>//定义标准输出流对象cout#include<fstream.h>//定义文件流类fstream#include<stdlib.h>//定义abort函数intmain(){fstreaminfile("file2.dat",ios::in),outfile("file3.dat",ios::out);if(!infile){cout<<"file2.dat打不开!\n";abort();}if(!outfile){cout<<"file3.dat打不开!\n";abort();}charch;while(infile.get(ch))outfile.put(ch);infile.close();outfile.close();}注意,该程序中共有几个内部文件?几个外部文件?内外如何对应?该程序运行前必须有哪些先决条件?该程序运行后会产生什么结果?能否用操作系统的方法检验本程序的成果?11.5.3二进制文件的读写操作二进制文件翻开方式中应指定:ios::binary写二进制文件使用成员函数:write()读二进制文件使用成员函数:read()这两个函数定义在fstream.h中原型分别为:ostream&write(constchar*pch,intn);istream&read(char*pch,intn);第1个参数要读写的字符指针,即字符串,向文件中写时,字符串不能被改变;第2个参数为要读写字符的个数。函数的使用格式为:二进制内部文件名.write(待写入的字符串地址,字符串长度)二进制内部文件名.read(字符串读入地址,字符串长度)

【例11.23】使用成员函数read、write读写二进制文件#include<iostream.h>//定义标准输出流对象cout#include<fstream.h>//定义文件流类fstream#include<stdlib.h>//定义abort函数structperson{charname[80];doubleheight;unsignedshortage;};personpeople[5]={"马",1.78,35,"张",1.68,24,"胡",1.90,40,"鲁",1.89,50,"郎",2,18};intmain(){fstreamfile("file4.dat",ios::in|ios::out|ios::binary);if(!file){cout<<"file4.dat打不开!\n";abort();}for(inti=0;i<5;i++)file.write((char*)&people[i],sizeof(people[i]));

file.seekp(0,ios::beg);//文件写指针定位函数,本句定位开头for(i=0;i<5;i++){file.read((char*)&people[i],sizeof(people[i]));cout<<people[i].name<<'\t'<<people[i].height<<'\t';cout<<people[i].age<<endl;}file.close();}【例11.24】存储本科生、硕士生信息文件(定义本科生)#include<iostream.h>//定义标准输出流对象cout#include<fstream.h>//定义文件流类fstream#include<string.h>//定义字符串处理函数#include<iomanip.h>//定义输入输出控制符〔控制子〕classStudent{public:Student(char*pN,unsignednum,doubleg){strcpy(Name,pN);uID=num;grade=g;}virtualvoidPrint(ostream&out);friendostream&operator<<(ostream&out,Student&st);private:charName[80];unsigneduID;doublegrade;};voidStudent::Print(ostream&out){out.setf(ios::left,ios::adjustfield);out.width(15);out<<Name<<uID;out.setf(ios::right,ios::adjustfield);out.width(8);out<<grade;}ostream&operator<<(ostream&out,Student&st){st.Print(out);out<<endl;returnout;}【例11.24】存储本科生、硕士生信息文件(定义研究生)classMaster:publicStudent{public:Master(char*pN,unsignednum,doubleg,char*pdN):Student(pN,num,g){strcpy(dName,pdN);}

voidPrint(ostream&out);

private:chardName[80];};voidMaster::Print(ostream&out){Student::Print(out);out<<""<<dName;}intmain(){ofstreamout("abc.txt");

//if(!out){cout<<"abc.txt打不开!\n";abort();}Students1("王萍",99001,96.5);Masters2("马光",99056,84.8,"胡"),s3("江芳",99078,90,"黄");

out<<s1<<s2<<s3;out.close();}注意,①插入符是重载的,②插入符的重载定义中,Print动态联编。11.5.4随机文件的读写操作从文件头开始读或从文件尾开始写,称为顺序读写在文件的任意位置进行读写操作,称为随机读写操作,可随机读写的文件称为随机文件。随机读写文件需要:①按读写方式翻开文件②使用定位函数将读写指针定位到所需位置,读写指针只有一个,但是有读、写两组函数对它进行操作③使用读写函数对文件进行读写读指针定位的成员函数为:seekg()其原型为istream&seekg(位置);istream&seekg(偏移量,参照位置);其中位置和偏移量为长整数,参照位置为以下3个之一:ios::beg(值为0)、ios::cur(值为1)、ios::end(值为2)分别表示文件开头、当前位置、文件结尾写指针定位的成员函数为:seekp()

其原型为ostream&seekp(位置);

ostream&seekp(偏移量,参照位置);

其中位置和偏移量为长整数,参照位置为以下3个之一:

ios::beg(值为0)、ios::cur(值为1)、ios::end(值为2)

分别表示文件开头、当前位置、文件结尾

取当前读指针位置的成员函数原型为:longteelg()

取当前写指针位置的成员函数原型为:longteelp()

这两个取指针位置函数返回的长整数表示读写的当前位置距离文件开头的字节数。

一般指针定位、取指针位置的函数的使用格式为:

内部文件名.seekp(偏移量,参照位置)

内部文件名.seekg(偏移量,参照位置)

内部文件名.tellg()、内部文件名.tellp()

④文件读写结束应注意使用close函数关闭文件【例11.25】存储整数的二进制文件#include<iostream.h>#include<fstream.h>#include<stdlib.h>intmain(){fstreamfile("file5.dat",ios::in|ios::out|ios::binary);

if(!file){cout<<"file5.dat打不开!\n";abort();}

for(inti=1;i<=20;i++)file.write((char*)&i,4);

longpos=file.tellp();cout<<"当前字节数:"<<pos<<endl;

for(i=21;i<=50;i++)file.write((char*)&i,4);

file.seekp(pos);file.read((char*)&i,4);cout<<"存储的数据是:"<<i<<endl;

file.seekg(0,ios::beg);for(i=51;i<=100;i++)file.write((char*)&i,4);

file.seekg(pos);file.read((char*)&i,4);//此时指针指向哪个整数?cout<<"存储的数据是:"<<i<<endl;

file.seekp(112,ios::cur);file.read((char*)&i,4);cout<<"存储的数据是:"<<i<<endl;//此时的i是第几个整数?cout<<"当前字节数:"<<file.tellp()<<endl;file.close();}注意,①文件中读写数字的方法,②读写指针定位的方法。【例11.26】存储对象数组的二进制文件#include<iostream.h>#include<fstream.h>#include<stdlib.h>intmain(){structstudent{charname[50];longnumber;double

温馨提示

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

评论

0/150

提交评论