12读写文件

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

主讲教师:黄襄念西华大学数学与计算机学院图像处理与模式识别实验室计算机文件(File)•文件——存储数据数据以文件形式存放于外存。操作系统以文件为单位管理数据,实行按名存取。文件一定要有名字。•设备文件键盘、鼠标、显示器、打印机、端口等外设都被抽象为文件设备文件,读写设备文件即读写该设备。•文件按用途有多种类型扩展名区别*.MP3,*.RAR,*.DOC,*.GIF,*.AVI,…都是二进制文件,需要专用软件打开它们2/30C/C++文件•文件是一个字节流流水一样,没有边界•最小数据单位:字节——按字节读写文件文件的读写(文件操作)①C文件操作文件操作函数,自学②C++文件操作流对象(C++提供流类),更强大、更安全③WinAPI文件操作自学3/30二进制文件与文本文件•二进制文件——字节序列文件内数据与内存数据的格式相同,例如:数5678内存格式:0001011000101110存入文件2字节每个字节不对应一个字符人不能阅读(乱码)•文本文件ASCII文件(字符转换)——字符序列用某编码ASCII,UNICODE,…把内存数据转换为字符序列后存入文件。例如:内存数5678存储:转换为字符序列56784字符存入文件4字节读取:字符序列5678十进制ASCII:53,54,55,56内存:001101010011011000110111001110005678•文本文件尺寸更大•字符转换耗费时间•二进制文件更优秀便于人阅读4/30文本文件的换行符转换•写入文件将0a(换行符\n)替换为0d0a(回车换行符)写入文件•读取文件将0d0a替换为0a后存入内存•二进制文件不作转换文件流类流对象与某个文件建立关联后,流对象即该文件读写该流对象,就是读写其关联文件cin:系统定义的流对象,与键盘设备文件关联cout:系统定义的流对象,与屏幕设备文件关联\r:0x0d,回到当前行的行首\n:0x0a,换到下一行的当前位置5/30文件流类与头文件•ofstreamoutput,输出流类,写文件——数据写入文件•ifstreaminput,输入流类,读文件——从文件中读数据•fstream文件流类,可读可写文件•文件操作头文件#includefstream6/30读写文件的三步①打开文件选择文件流类,创建流对象并与要读写文件关联②读写文件写(Output):内存数据→文件读(Input):内存数据←文件③关闭文件读写文件完毕后,及时关闭文件下面讲述具体操作7/30打开文件•初始化方式:创建流对象,同时打开文件ifstreamfin(test.dat,ios::in);•创建流对象后,用open成员函数打开ofstreamfout1,fout2;fout1.open(d:\\test.dat,ios::out);fout2.open(..\\test.dat,ios::out);•打开文件的路径绝对路径,相对路径,缺省路径。可用变量保存文件名包括路径,char*voidifstream::open(constchar*,int=ios::in,int=filebuf::openprot);缺省路径绝对路径相对路径8/30打开文件方式标志的组合•举例ios::in|ios::binary二进制方式,读文件ios::out|ios::binary二进制方式,写文件ios::in|ios::out文本文件方式,可读写ios::in|ios::out|ios::binary二进制方式,可读写•多个标志共用一个32bits整数的若干位•标志位组合:|9/30检查文件打开是否成功•方式一用流对象的成员函数fail检查ifstreamfin;fin.open(test.dat,ios::in)if(fin.fail()==true)cout打开文件失败;elsecout打开文件成功;10/30•方式二检查流对象是否等于0if流对象=0,打开失败else,打开成功---------------------------------------------------ifstreamfin(test.dat,ios::in);if(fin==0)//if(!fin)cout打开文件失败;elsecout打开文件成功;11/30关闭文件文件操作完后应及时关闭,同时打开文件数有限制•文件关闭解除流对象与文件的关联解除后,该流对象可与其他的文件关联ofstreamfout(demo.txt,ios::out);//与demo.txt文件关联...…;//打开文件进行若干操作fout.close();//使用完毕后及时关闭fout.open(test.dat,ios::out|ios::binary);//再与test.dat文件关联12/30读写文本文件•写入文本文件:流插入符•读取文本文件:流提取符与cout,cin用法和效果一样cin,cout换成了文件流对象(关联某文件)•注意读文本文件:①有字符转换;②忽略空白字符——如果不希望字符转换,用二进制方式读写——如果不希望忽略空白字符,用读写函数如:get,getline等。13/30读取文本文件案例读取工作目录下文本文件demo.txt的全部数据,计算它们的平均值,并按输出样例的格式输出有关信息。文件内容:输出样例:注意demo.txt内容:•浮点数、整数、错数•分隔符有多种样式还包括中文符号。•最后有一个分隔符14/30#includeiostream#includefstream//文件操作usingnamespacestd;voidmain(){ifstreamin;//读文件in.open(demo.txt);//缺省路径、缺省方式if(!in)//in!=0{cout打开文件失败!;return;}15/30charch,strNum[5];//存放1个数(字符串≤5个字符)doubleNum[9]={};//存放9个数inti=0,n=0;//n:数的个数while(in){inch;//逐个读取字符if((ch='0'&&ch='9')||(ch=='.'))//逐个字符判断{strNum[i]=ch;i++;//数字字符和小数点存入数组}else{strNum[i]='\0';//0if(i0)//排除连续非数字字符{Num[n]=atof(strNum);n++;}i=0;}}16/30cout(;doublesum=0;for(i=0;in;i++){coutNum[i];if(in-1)cout'+';sum+=Num[i];}cout)/n=sum/nendl;in.close();}17/30格式化输出→文本文件输出到文本文件与输出到屏幕上是一样的屏幕也是文件。格式化输出案例:把doublenum[4]={1,1.2,12.345,123.125}按输出样例输出到屏幕和文本文件myFile.txt中输出样例:18/30#includeiostream#includefstream#includeiomanip//格式符头文件usingnamespacestd;voidmain(){doublenum[4]={1,1.2,12.345,123.125};stringfile=myFile.txt;//变量保存文件名,缺省路径ofstreamout(file);//省略ios::outout.precision(2);//设置浮点数的精度cout.precision(2);for(inti=0;i4;i++){//fixed:用浮点格式;setfill:设置前导0outfixedsetw(6)setfill('0')num[i]endl;coutfixedsetw(6)setfill('0')num[i]endl;}//setw:设置输出位宽out.close();}19/30读写二进制文件•任何文件均可用二进制方式打开读写•不用和读写字符转换——不希望的•若缺省文件打开方式,默认为文本方式in.open(myfile.dat,ios::in|ios::binary);两个常用函数file.write((char*)buffer,intlen);file.read((char*)buffer,intlen));buffer:内存块首地址len:读写字节数,sizeof(…)获得char*:按字节读写filebufferwriteread20/30读写二进制文件structInfo{charname[21];intage;charaddress[81];};•把结构体作为一个整体存入文件myFile.hxn•显示该文件的全部数据输出样例21/30#includeiostream#includefstreamusingnamespacestd;structInfo{charname[21];intage;charaddress[81];};voidmain(){fstreampeople(people.dat,ios::out|ios::binary);if(people.fail()){cout打开文件people.dat出错!\n;return;}cout===输入下面的数据===\n;22/30Infoperson;charagain;do//键入数据,存入文件{cout姓名:;cin.getline(person.name,20);cout年龄:;cinperson.age;//自动忽略空白字符cin.ignore();//跳过换行符,想想为什么?cout地址:;cin.getline(person.address,80);people.write((char*)&person,sizeof(person));cout再输入一个同学的数据吗?;cinagain;cin.ignore();}while(toupper(again)=='Y');people.close();//为什么要关闭?否则会怎样?cout\nn===显示所有人的数据===\n;读取换行符前的所有字符换行符为终止符,可改变23/30people.open(people.dat,ios::in|ios::binary);if(people.fail()){cout打开文件people.dat出错!\n;return;}//while(!people.eof())//理解eof成员函数while(people.peek()!=EOF)//理解peek成员函数和EOF{people.read((char*)&person,sizeof(person));cout姓名:person.nameendl;cout年龄:person.ageendl;cout地址:person.addressendl;cout\n按任意键,显示下一个记录!\n;cin.get(again);//这里again有什么作用?}people.close();cout显示完毕!\n\n;}24/30随机访问文件•从文件内的任意指定位置开始读写,并非从头至尾•注意:文本文件存在字符转换文件指针•定义:读写文件的当前位置位置指示符•存在于文件流对象的内部•文件读写过程每读写一个字节,文件指针前移一个字节前移:文件头→尾方向移动25/30移动文件指针,实现随机读写文件•seekp(long,int)//p:put,写文件用seekg(long,int)//g:get,读文件用把文件指针移到指定位置(long,int)•int参数——预定义常量ios::beg文件头ios::end文件尾ios::cur当前位置(current)•long参数——偏移量(字节)23

1 / 30
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功