您好,欢迎访问三七文档
主讲教师:黄襄念西华大学数学与计算机学院图像处理与模式识别实验室计算机文件(File)•文件——存储数据数据以文件形式存放于外存。操作系统以文件为单位管理数据,实行按名存取。文件一定要有名字。•设备文件键盘、鼠标、显示器、打印机、端口等外设都被抽象为文件设备文件,读写设备文件即读写该设备。•文件按用途有多种类型扩展名区别*.MP3,*.RAR,*.DOC,*.GIF,*.AVI,…都是二进制文件,需要专用软件打开它们2/30C/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
本文标题:12读写文件
链接地址:https://www.777doc.com/doc-3694931 .html