版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、文本流和二进制流二、流文件三、文件的打开函数fopen和关闭函数fclose四、格式读写fprintf和fscanf函数五、出错测试或清除函(feof,ferror,clearerr)第13章文件1一、文本流和二进制流第13章文件1一、文本流和二进制流内存中的信息会由于程序运行的结束而消失。程序运行的结果需要另外稳定的介质加以永久保存,这种可以长期保留数据的存储设备称为磁盘文件。下面几种是有影响的存储方式:
1.ANSIC运行库缓冲流的输出输出操作
2.C运行库低级输出输出操作
3.iotream类提供的I/O操作
4.DOS或WINDOWSAPI端口操作5.MicrosoftFoundation类库的文件操作
2一、文本流和二进制流2在C/C++中流可分为两类:
1)文本流(textstream);1)二进制流(binarystream)文本流中的数据以字符形式出现,文本以行作为结束。
图数据的流入流出是一个相对概念
流入cout<<b输出输入cin>>a流入
磁盘
内存缓冲区
内存数据区
键盘stdinstdout显示器stderr打印机stdprn3在C/C++中流可分为两类:图数据的流入流出是一个二、流文件流文件是C运行库函数中由FILE结构有效处理的硬件设备的逻辑描述。在这个称为标准文件I/O系统中,定义了三个文本流:stdin,stdout和stderr。一般对如下前3个标准设备,系统构筑了流文件的索引方式,其相应的非缓冲区的文件代号一并罗列如下:
硬件设备预定义的流文件或流对象设备代号或句柄键盘(标准输入)stdincin0显示器(标准输出)stdoutcout1显示器(标准错误)stderrcerr2串行口(标准辅助)stdaux3打印机(标准打印)stdprnclog44二、流文件4描述流文件的FILE数据结构随编译器版本的不同而相异,下面的描述摘自微软VC6.0头文件stdio.h,该结构的具体声明如下:struct_iobuf{char*_ptr;//1索引数据流内容的位置指针int_cnt;//2当前的定位标志数char*_base;//3缓冲区基准位置int_flag;//4文件操作模式标记int_file;//5文件的代号int_charbuf;//6字符缓冲信息int_bufsiz;//7缓冲区大小char*_tmpfname;//8临时文件名};typedefstruct_iobufFILE;5描述流文件的FILE数据结构随编译器版本的对于该结构软件供应商并未逐一指明其中每一数据成员的详细含义,标准输入输出函数的用户不要冒然直接去操作其中的成员,而通过相应的函数间接进行。 三个预定义的流文件在vc6.0的stdio.h中通过通过外部说明语句和宏:
externFILE_iob[]; #definestdin(&_iob[0]) #definestdout(&_iob[1]) #definestderr(&_iob[2]) 就已经在内存中构建,因此不对这三个标准的I/O设备进行建立和清除工作。但其它的流文件需要程序员调用相关的函数,进行规则的内存分配和释放工作。6对于该结构软件供应商并未逐一指明其中每一数据成三、文件的打开函数fopen和关闭函数fclose1.文件的打开函数fopen文件的打开函数fopen是为要操作的磁盘文件对应的数据结构分配内存的函数,这是一个构建FILE的数据结构变量的初始化函数,系统通过调用类似malloc的堆内存分配函数完成了FILE型结构变量的内存分配。下面是fopen函数一个简约的函数原型:
FILE*fopen(constchar*filename,constchar*mode);函数返回一个指向堆空间的FILE*型的流文件指针。不如确切地说该函数在堆空间诞生了一个FILE型结构变量。7三、文件的打开函数fopen和关闭函数fclose7两个constchar*型的入口参数对上面的结构成员执行了部分初始化赋值。第一个参数filename是定位磁盘文件路径的文件名,该文件名通常是双引号括起来的只读字符串。在使用含路径的文件名时,注意“\”的使用,对于硬盘中的文件d:\mydocu_1\ex.cpp应写成“d:\\mydocu_1\\ex1.cpp”或进行如下的初始赋值:constchar*filename="d:\\mydocu_1\\ex1.cpp"; 第二个以只读字符串的形式出现的参数mode,界定文件访问操作的模式。(其有效的取值组合和含义见下一页)8两个constchar*型的入口参数对上mode含义"r"以readonly方式打开一个文本文件,如果输入文件不存在或未找到fopen失败"w"以writeonly方式打开一个文本文件,如果输出文件已存在,内容将全覆盖"a"以写和append方式在文本文件末尾追加,如果它不存在则先建立该文件"r+"以读或写的方式打开一个必须已经存在的文本文件"w+"以读或写的方式打开一个空文件,如果给定的文件名存在原来的内容将被冲洗"a+"以读/写和追加方式打开文件,如果该文件不存在则先建立它9mode含义9"rb"以只读方式打开一个binary输入文件,如果文件不存在或未找到fopen失败"wb"以只写方式打开一个二进制输出文件,如果文件已存在,内容将全覆盖"ab"以append方式在binary文件末尾追加,如果它不存在则先建立该文件"rb+"以读或写的方式打开一个必须已经存在的二进制文件"wb+"以读或写的方式打开一个空binary文件,如果文件名存在原来的内容将被销毁"ab+"以读和追加方式打开二进制文件,如果该文件不存在则先建立它10"rb"以只读方式打开一个binary输指定文件的缺省操作类型取决于一个全局变量_fmode,vc6.0里在头文件stdlib.h中声明为[externint_fmode;],系统设置的默认值是文本方式即:_fmode=O_TEXT=0x4000如果从文本方式切换为二进制模式,可以在程序中令:_fmode=O_BINARY;如果在打开文件发生错误,则fopen都返回NULL即0,其潜在的原因有:
a.以读模式打开一个并不存在的文件
b.打开一个无权操作的文件(如该文件已标明只读或隐藏属性试图写追加打开)
c.以追加方式对文件操作但磁盘空间不足11指定文件的缺省操作类型取决于一个全局变量2.文件的关闭函数fclose函数fclose专用于释放由函数fopen申请的堆空间,及时完成缓冲区数据的到位。fclose的函数原型为:
intfclose(FILE*fp);fclose的函数原型为:intfclose(FILE*fp);其中入口形参匹配函数fopen返回的指针值,函数fclose调用成功返回数值0,否则返回EOF即-1。该函数不操作预定义的流文件stdin,stdout和stderr,它们是指向全局结构变量的指针。这样函数调用:
fclose(fp);就关闭了先前由fopen函数打开的文件指针所对应的堆空间。122.文件的关闭函数fclose12四、格式读写fprintf和fscanf函数
1.fprintf输出函数fprintf输出函数的一般形式为:
intfprintf(FILE*pTarget,constchar*format,argument_list); intfprintf(流文件的目的地,格式控制串,参量列表);
fprintf函数格式控制串与printf中的相同。将fprintf的第一个形参pTarget取为实参stdout,其调用格式相当于printf函数。即
fprintf(stdout,格式控制串,参量列表);
相当于:printf(格式控制串,参量列表);
13四、格式读写fprintf和fscanf函数13在使用fprintf将内存数据写到磁盘文件之前,先要指明磁盘文件的目的所在,因此通过fopen函数的写模式获得目标地址。如:FILE*fpWrite=fopen(writeFile,"w");如此之后就可以调用的fprintf函数.如:fprintf(fpWrite,format,v_list);fprintf(流文件目的地,格式控制串,变量列表);14在使用fprintf将内存数据写到磁盘文件之2.fscanf输入函数fscanf函数的一般形式为:
intfscanf(FILE*pSource,constchar*format,address_list); intfscanf(流文件的来源处,格式控制串,变量的地址列表);将fscanf的第一个形参pSource实参化为stdin,其调用格式相当于scanf函数。即:
fscanf(stdin,格式控制串,变量地址1,变量地址2....变量地址n);相当于:
scanf(格式控制串,变量地址1,变量地址2....变量地址n);
152.fscanf输入函数15在调用fscanf函数将磁盘源文件中的数据送到变量所占住的内存之前,先应指明待读的磁盘文件,因此借助fopen函数的读模式得到数据源流的地址如:FILE*fpRead=fopen(readFile,"r");如此之后就可以调用输入函数fscanf。格式为:
fscanf(fpRead,format,address_list);16在调用fscanf函数将磁盘源文件中的数据送到[例]格式转换处理一个结构变量.#include<stdio.h>typedefstructSData{intnLineset;floatfAdjust;intnPoint; floatfXa; floatfYa; floatfZa; }CData;voidOutputData(constchar*filename,constCData&d) {FILE*fp=fopen(filename,"w");
fprintf(fp,"%d,%f,%d\n",d.nLineset,d.fAdjust,d.nPoint);//1 fprintf(fp,"%f,%f,%f\n",d.fXa,d.fYa,d.fZa);//2 fclose(fp); }17[例]格式转换处理一个结构变量.17voidInputData(constchar*filename,CData&d) {FILE*fp=fopen(filename,"r");fscanf(fp,"%d,%f,%d",&d.nLineset,&d.fAdjust,&d.nPoint);fscanf(fp,"%f,%f,%f",&d.fXa,&d.fYa,&d.fZa);//2 fclose(fp);} 1818voidmain(void){CDatas={1,2,3,4,5,6};OutputData("c:\\sdata.out",s);CDatad;InputData("c:\\sdata.out",d);OutputData("c:\\cdata.out",d); }在文件c:\cdata.out中输出结果为:1,2.000000,34.000000,5.000000,6.000000在文件c:\sdata.out中输出结果为:1,2.000000,34.000000,5.000000,6.00000019voidmain(void)19五、出错测试或清除函(feof,ferror,clearerr)1.feof函数测试文件结束标志feof函数的原型为:
intfeof(FILE*stream);该函数的调用格式常为:
while(!feof(stream))读写循环体;2.ferror函数测试流中的错误ferror函数的原型为:
intferror(FILE*stream);3.clearerr函数清除错误标志为0 clearerr函数原型为:
[voidclearerr(FILE*stream);]20五、出错测试或清除函(feof,ferror,clearer
六、字符和字符串读写函数
七、无格式转换的读写函数fread和fwrite
八、文件的定位
九、一个简单的读写存盘程序步骤第13章文件21第13章文件21六、字符和字符串读写函数
1.读取单个字符的fgetc函数
fgetc函数的原型为:intfgetc(FILE*pSrcFile);
FILE*型的入口形参指明读取操作的来源,实参匹配fopen打开的磁盘文件或stdin。该函数从磁盘文件的当前位置读取一个字符,定位源磁盘文件的位置指针向后移动一个字节。如果该指针到达文件末尾,fgetc函数返回EOF。
注意例程getc与函数fgetc作用相同但可以作为函数和宏出现。getchar()例程与getc(stdin)一致,亦可以作为函数和宏出现。22六、字符和字符串读写函数22[例]fgetc.cpp#include<stdio.h>voidmain(void){FILE*fpGet=fopen("fgetc.cpp","r"); if(fpGet==NULL){printf("fopenfailed\n");return;}inti=0; charbuffer[512]; while(feof(fpGet)==0&&i<512)buffer[i++]=fgetc(fpGet); buffer[i]='\0'; printf("%s\n",buffer); //fclose(fpGet); }//程序运行的结果显示fgetc.cpp在屏幕上23[例]fgetc.cpp232.存写单个字符的fputc函数fputc函数的原型为:intfputc(intch,FILE*pDstFile);fputc函数的第一个形参ch正是要存写到第二个形参pDstFile关联的磁盘文件中去的字符,该函数返回第一个入口形参的实参值。pDstFile匹配一个fopen返回的流文件指针或stdout,调用失败返回EOF。242.存写单个字符的fputc函数24[例]fputc.cpp#include<stdio.h>voidmain(void){FILE*fpGet=fopen("fputc.cpp","r");if(fpGet==NULL){printf("fopenfailed\n");return;}FILE*fpPut=fopen("fputc.xpp","w"); if(fpPut==NULL){printf("fopenfailed\n");return;} while(!feof(fpGet))//while(feof(fpGet)==0)fputc(fgetc(fpGet),fpPut);fclose(fpGet);fclose(fpPut);}25[例]fputc.cpp25程序运行之后即将上面的fputc.cpp源程序转存到fputc.xpp中。上面单个输入输出函数其返回类型是int型的数值,虽然处理的是仅一个字节长的字符。因此接受这些函数的结果的变量最好定义成int型变量即:intch1=fgetc(pSrcFile); 函数一般地会自动进行截断整型高位数的处理而只存写低位。而能不失包容性地应付占两个字节的重要结尾信息EOF(-1)。26程序运行之后即将上面的fputc.c3.按行读文本串fgets函数函数fgets的原型为:char*fgets(char*pDstBuffer,intnum,FILE*pSrcFile); FILE*型的入口形参pSrcFile定位数据的来源,匹配实参stdin或fopen函数读模式返回的流文件的指针,从中读取num-1个字符到char*的入口形参pDstBuffer标明的字符缓冲区,pDstBuffer也就是该函数的返回地址。如果在读取num-1个字符之前遇到换行符\n则读入结束;然后添补一个\0字符,以表示字符串的规则结束。暗地里定位源磁盘文件的位置指针向后移动字符缓冲区实际拥有的字节数.pDstBuffer匹配一个足够大的字符数组.273.按行读文本串fgets函数27[例]fgets.cpp
#include<stdio.h>voidmain(void){FILE*fp=fopen("fgets.cpp","r");if(fp==NULL){printf("fopenfailed\n");return;}charsBuffer[128]; for(intk=0;k<9;k++) if(fgets(sBuffer,128,fp)!=NULL)printf("%s",sBuffer);fclose(fp);}//程序运行的结果显示fgets.cpp在屏幕上。28[例]fgets.cpp284.按行写文本串fputs函数
函数fputs的原型为:
intfputs(constchar*pSrcBuffer,FILE*pDstFile);文本文件的操作一般按行进行,一行一行地读一行一行地写,fgets函数执行按行读的操作,函数fputs则按行写。
fputs函数将第一个形参定位的只读字符串送到送到第二个形参指明的目的文件中的当前位置。如果调用成功函数返回正数,在出现错误时返回EOF。294.按行写文本串fputs函数29[例]fputs.cpp#include<stdio.h>voidmain(void){ FILE*fpRead=fopen("fputs.cpp","r");if(fpRead==NULL){printf("fopenrfailed\n");return;}FILE*fpWrite=fopen("fputsw.cpp","w"); if(fpWrite==NULL){printf("fopenwfailed\n");return;} 30[例]fputs.cpp30chars[81]; while(!feof(fpRead))//while(feof(fpRead)==0) if(fgets(s,81,fpRead)!=NULL) {fputs(s,fpWrite);printf("%s",s);} fclose(fpWrite);}
//程序运行显示fputs.cpp在屏幕上同时拷贝了一个备份在磁盘文件fputsw.cpp中31chars[81];七、无格式转换的读写函数fread和fwrite函数直接读写磁盘文件的二进制数据,读写过程数据的信息未发生转换。因而空间效率和时间效率都比较高。1.函数fread的原型为:
size_tfread(void*pDst,size_tsize,size_titems,FILE*pSrc);第一个参数pDst定位读取数据的存放位置,匹配任意集合类型的起始地址。 第二个参数size指出数据的类型大小;size=sizeof(type)。
32七、无格式转换的读写函数fread和fwrite32第三个参数items指出数据的最大项数,常对应数组的维数,单一变量或对象常取1。第四个参数是FILE*型的入口形参pSrc,指明读入数据的来源。fread返回实际读取的项数,函数从输入文件中最多读取items项数,每一项含有size字节,并将它们放入pDst起始的内存中。如果错误发生则所读的结果是游移的。与pSrc关联的位置指针向后移动实际读取的字节数。33第三个参数items指出数据的最大项数,常对2.fwrite存写函数函数fwrite的原型为:
size_tfwrite(constvoid*pSrc,size_tsize,size_titems,FILE*pDst);一般地fread总是读取原先由frwite存写的二进制数据;第一个参数入口形参pSrc定位所写数据的源位置,匹配任意集合类型的起始地址。 第四个参数入口形参pDst指向待存写的目的地即与pDst相关联的磁盘文件。其余两个参数同fread函数。
342.fwrite存写函数34函数fwrite返回实际所存写的数据项的个数,如出现错误返回值可少于items。fwrite函数从pSrc定位地址起尽量转送items个数据项到输出流文件中,位置指针递增实际所写的字节数。上面两个函数都存在void*的指针用于宽泛地定位内存的地址,但由于其含糊性必伴随具有size_t类型的具体参数严格划定数据的边界,这是void*型形参函数的共性。 一般地fread总是读取原先由frwite存写的二进制数据。35函数fwrite返回实际所存写的数据项的个[例]直接随机方式处理结构变量和数组#include<stdio.h>typedefstructSData{intnLineset;floatfAdjust;intnPoint; floatfXa; floatfYa;floatfZa; }CData;voidWriteData(CDatapSrc[],intn,FILE*fpDst){switch(n){case1: fwrite(pSrc,sizeof(CData),1,fpDst);break; default: fwrite(pSrc,sizeof(CData),n,fpDst);}}inlinevoidReadData(CData*pDst,intn,FILE*fpSrc){fread(pDst,sizeof(CData),n,fpSrc);}36[例]直接随机方式处理结构变量和数组36voidPrintData(constCData&d){printf(“%4d,%4.1f,%4d,%4.1f,%4.1f,%4.1f\n”,d.nLineset,d.fAdjust,d.nPoint,d.fXa,d.fYa,d.fZa);}voidmain(void) {CDatas={0,1,2,3,4,5};CDatad[]={1,2,3,4,5,6,2,3,4,5,6,7,3,4,5,6,7,8};FILE*fpWrite=fopen("c:\\cdata.dat","w"); if(fpWrite==NULL){printf("fopenwfailed\n");return;} WriteData(&s,1,fpWrite);WriteData(d,3,fpWrite); fclose(fpWrite);FILE*fpRead=fopen("c:\\cdata.dat","r");
37voidPrintData(constCData&if(fpRead==NULL){printf("fopenrfailed\n");return;}CDatab[4];ReadData(b,3,fpRead);ReadData(b+3,1,fpRead);for(intk=0;k<4;k++)PrintData(b[k]);}
c:\cdata.dat文件的长度为4*6*4=96个字节,屏幕显示结果为:0,1.0,2,3.0,4.0,5.01,2.0,3,4.0,5.0,6.02,3.0,4,5.0,6.0,7.03,4.0,5,6.0,7.0,8.038if(fpRead==NULL)38fread和fwrite函数因其void*入口参数而可以匹配任意类型的变量地址,而称为随机读写函数。但实际上数据的类型属性转移到size_t参数上去了,这个size_t参数n=sizeof(type)协同函数在定位好的内存空间中读写数据。因此数据类型属性的匹配依然是环环相扣不可轻易错位的。即此类型的函数操作此类型的数据。随机读写应根据数据类型的匹配关系为:voidWriteData(CData*pSrc,intn,FILE*fpDst){fwrite(pSrc,sizeof(CData),n,fpDst);}
voidReadData(CData*pDst,intn,FILE*fpSrc){fread(pDst,sizeof(CData),n,fpSrc);}39fread和fwrite函数因其void*入八、文件的定位1.ftell函数告知当前位置FILE结构的声明中有一个char*型指针成员_ptr即索引数据流内容的位置指针,该指针潜在地指向当前文件的位置。当用户首次打开流文件进行读写操作时,操作系统把该位置指针设置在文件的开头。但特别地以追加方式a打开文件时,位置指针定位于文件的结尾处。每次读写一个字符时,位置指针向前移动一个字符。如果从文件中读写一行文本,位置指针一般移到该行末尾或下一行开始处。40八、文件的定位40ftell函数告知当前位置函数ftell的原型为:
longftell(FILE*stream);函数返回的long型值为指定文件中的当前位置相对于流文件起始位置的字节偏移量,stream一般匹配fopen函数打开的文件。[例]ftell.cpp#include<stdio.h> voidmain(void){FILE*stream=fopen("ftell.cpp","rb");doublea[20];fread(a,sizeof(double),20,stream);printf("%d\n",ftell(stream));}//输出16041ftell函数告知当前位置函数ftell的原2.fseek函数探寻文件的位置函数fseek用于在一个打开的文件中重新定位文件的位置指针,如果成功返回结果0,否则返回非0值,在不能探寻的设备上返回的结果是不定的。其函数原型为:
intfseek(FILE*stream,longoffset,intorigin);//fseek(文件指针,偏移量,起始位置);起始位置参量origin的取值范围必须是如下的宏名或随后具体的常数,含义为: #defineSEEK_CUR1//文件当前位置 #defineSEEK_END2//文件结束位置 #defineSEEK_SET0//文件开始位置
422.fseek函数探寻文件的位置42fseek函数在stream形参所对应的文件中运作,将其中的位置指针变动到新的位置,新的位置由offset算定。偏移量参量offset指出距离origin起始位置的字节偏移数,正的long型实参表示以起始位置为基准前移offset个字节作为新的位置,负的实参则后移。 在流上的下一回合操作以新的位置为基准,一般可安全地用于二进制文件。 fseek函数操作文本文件的结果漂移于回车换行次数的不确定性。43fseek函数在stream形参所对应的文件3.rewind函数反绕到文件开头位置rewind函数原型为:
voidrewind(FILE*stream); 函数rewind重新定位与stream关联的位置指针到文件的开头。函数调用[rewind(stream);]近似于:(void)fseek(stream,0L,SEEK_SET);但不象fseek,函数rewind清除文件结束符和stream的出错标记。443.rewind函数反绕到文件开头位置44九、一个简单的读写存盘程序步骤 读写存盘操作是程序设计中的重要工作,程序的读写操作主要包含如下步骤和特点:
1.构筑待存盘操作的数据结构,不同的数据结构对应不同的函数;
2.明晰数据的来源和走向,屏幕操作利用格式转换函数以进行字符处理;
3.格式化输出一般用于显示数据,格式化磁盘输入常严格呼应格式化输出函数;
4.非格式化函数直接在内存和磁盘之间输送数据无需信息转换.45九、一个简单的读写存盘程序步骤45一、文本流和二进制流二、流文件三、文件的打开函数fopen和关闭函数fclose四、格式读写fprintf和fscanf函数五、出错测试或清除函(feof,ferror,clearerr)第13章文件46一、文本流和二进制流第13章文件1一、文本流和二进制流内存中的信息会由于程序运行的结束而消失。程序运行的结果需要另外稳定的介质加以永久保存,这种可以长期保留数据的存储设备称为磁盘文件。下面几种是有影响的存储方式:
1.ANSIC运行库缓冲流的输出输出操作
2.C运行库低级输出输出操作
3.iotream类提供的I/O操作
4.DOS或WINDOWSAPI端口操作5.MicrosoftFoundation类库的文件操作
47一、文本流和二进制流2在C/C++中流可分为两类:
1)文本流(textstream);1)二进制流(binarystream)文本流中的数据以字符形式出现,文本以行作为结束。
图数据的流入流出是一个相对概念
流入cout<<b输出输入cin>>a流入
磁盘
内存缓冲区
内存数据区
键盘stdinstdout显示器stderr打印机stdprn48在C/C++中流可分为两类:图数据的流入流出是一个二、流文件流文件是C运行库函数中由FILE结构有效处理的硬件设备的逻辑描述。在这个称为标准文件I/O系统中,定义了三个文本流:stdin,stdout和stderr。一般对如下前3个标准设备,系统构筑了流文件的索引方式,其相应的非缓冲区的文件代号一并罗列如下:
硬件设备预定义的流文件或流对象设备代号或句柄键盘(标准输入)stdincin0显示器(标准输出)stdoutcout1显示器(标准错误)stderrcerr2串行口(标准辅助)stdaux3打印机(标准打印)stdprnclog449二、流文件4描述流文件的FILE数据结构随编译器版本的不同而相异,下面的描述摘自微软VC6.0头文件stdio.h,该结构的具体声明如下:struct_iobuf{char*_ptr;//1索引数据流内容的位置指针int_cnt;//2当前的定位标志数char*_base;//3缓冲区基准位置int_flag;//4文件操作模式标记int_file;//5文件的代号int_charbuf;//6字符缓冲信息int_bufsiz;//7缓冲区大小char*_tmpfname;//8临时文件名};typedefstruct_iobufFILE;50描述流文件的FILE数据结构随编译器版本的对于该结构软件供应商并未逐一指明其中每一数据成员的详细含义,标准输入输出函数的用户不要冒然直接去操作其中的成员,而通过相应的函数间接进行。 三个预定义的流文件在vc6.0的stdio.h中通过通过外部说明语句和宏:
externFILE_iob[]; #definestdin(&_iob[0]) #definestdout(&_iob[1]) #definestderr(&_iob[2]) 就已经在内存中构建,因此不对这三个标准的I/O设备进行建立和清除工作。但其它的流文件需要程序员调用相关的函数,进行规则的内存分配和释放工作。51对于该结构软件供应商并未逐一指明其中每一数据成三、文件的打开函数fopen和关闭函数fclose1.文件的打开函数fopen文件的打开函数fopen是为要操作的磁盘文件对应的数据结构分配内存的函数,这是一个构建FILE的数据结构变量的初始化函数,系统通过调用类似malloc的堆内存分配函数完成了FILE型结构变量的内存分配。下面是fopen函数一个简约的函数原型:
FILE*fopen(constchar*filename,constchar*mode);函数返回一个指向堆空间的FILE*型的流文件指针。不如确切地说该函数在堆空间诞生了一个FILE型结构变量。52三、文件的打开函数fopen和关闭函数fclose7两个constchar*型的入口参数对上面的结构成员执行了部分初始化赋值。第一个参数filename是定位磁盘文件路径的文件名,该文件名通常是双引号括起来的只读字符串。在使用含路径的文件名时,注意“\”的使用,对于硬盘中的文件d:\mydocu_1\ex.cpp应写成“d:\\mydocu_1\\ex1.cpp”或进行如下的初始赋值:constchar*filename="d:\\mydocu_1\\ex1.cpp"; 第二个以只读字符串的形式出现的参数mode,界定文件访问操作的模式。(其有效的取值组合和含义见下一页)53两个constchar*型的入口参数对上mode含义"r"以readonly方式打开一个文本文件,如果输入文件不存在或未找到fopen失败"w"以writeonly方式打开一个文本文件,如果输出文件已存在,内容将全覆盖"a"以写和append方式在文本文件末尾追加,如果它不存在则先建立该文件"r+"以读或写的方式打开一个必须已经存在的文本文件"w+"以读或写的方式打开一个空文件,如果给定的文件名存在原来的内容将被冲洗"a+"以读/写和追加方式打开文件,如果该文件不存在则先建立它54mode含义9"rb"以只读方式打开一个binary输入文件,如果文件不存在或未找到fopen失败"wb"以只写方式打开一个二进制输出文件,如果文件已存在,内容将全覆盖"ab"以append方式在binary文件末尾追加,如果它不存在则先建立该文件"rb+"以读或写的方式打开一个必须已经存在的二进制文件"wb+"以读或写的方式打开一个空binary文件,如果文件名存在原来的内容将被销毁"ab+"以读和追加方式打开二进制文件,如果该文件不存在则先建立它55"rb"以只读方式打开一个binary输指定文件的缺省操作类型取决于一个全局变量_fmode,vc6.0里在头文件stdlib.h中声明为[externint_fmode;],系统设置的默认值是文本方式即:_fmode=O_TEXT=0x4000如果从文本方式切换为二进制模式,可以在程序中令:_fmode=O_BINARY;如果在打开文件发生错误,则fopen都返回NULL即0,其潜在的原因有:
a.以读模式打开一个并不存在的文件
b.打开一个无权操作的文件(如该文件已标明只读或隐藏属性试图写追加打开)
c.以追加方式对文件操作但磁盘空间不足56指定文件的缺省操作类型取决于一个全局变量2.文件的关闭函数fclose函数fclose专用于释放由函数fopen申请的堆空间,及时完成缓冲区数据的到位。fclose的函数原型为:
intfclose(FILE*fp);fclose的函数原型为:intfclose(FILE*fp);其中入口形参匹配函数fopen返回的指针值,函数fclose调用成功返回数值0,否则返回EOF即-1。该函数不操作预定义的流文件stdin,stdout和stderr,它们是指向全局结构变量的指针。这样函数调用:
fclose(fp);就关闭了先前由fopen函数打开的文件指针所对应的堆空间。572.文件的关闭函数fclose12四、格式读写fprintf和fscanf函数
1.fprintf输出函数fprintf输出函数的一般形式为:
intfprintf(FILE*pTarget,constchar*format,argument_list); intfprintf(流文件的目的地,格式控制串,参量列表);
fprintf函数格式控制串与printf中的相同。将fprintf的第一个形参pTarget取为实参stdout,其调用格式相当于printf函数。即
fprintf(stdout,格式控制串,参量列表);
相当于:printf(格式控制串,参量列表);
58四、格式读写fprintf和fscanf函数13在使用fprintf将内存数据写到磁盘文件之前,先要指明磁盘文件的目的所在,因此通过fopen函数的写模式获得目标地址。如:FILE*fpWrite=fopen(writeFile,"w");如此之后就可以调用的fprintf函数.如:fprintf(fpWrite,format,v_list);fprintf(流文件目的地,格式控制串,变量列表);59在使用fprintf将内存数据写到磁盘文件之2.fscanf输入函数fscanf函数的一般形式为:
intfscanf(FILE*pSource,constchar*format,address_list); intfscanf(流文件的来源处,格式控制串,变量的地址列表);将fscanf的第一个形参pSource实参化为stdin,其调用格式相当于scanf函数。即:
fscanf(stdin,格式控制串,变量地址1,变量地址2....变量地址n);相当于:
scanf(格式控制串,变量地址1,变量地址2....变量地址n);
602.fscanf输入函数15在调用fscanf函数将磁盘源文件中的数据送到变量所占住的内存之前,先应指明待读的磁盘文件,因此借助fopen函数的读模式得到数据源流的地址如:FILE*fpRead=fopen(readFile,"r");如此之后就可以调用输入函数fscanf。格式为:
fscanf(fpRead,format,address_list);61在调用fscanf函数将磁盘源文件中的数据送到[例]格式转换处理一个结构变量.#include<stdio.h>typedefstructSData{intnLineset;floatfAdjust;intnPoint; floatfXa; floatfYa; floatfZa; }CData;voidOutputData(constchar*filename,constCData&d) {FILE*fp=fopen(filename,"w");
fprintf(fp,"%d,%f,%d\n",d.nLineset,d.fAdjust,d.nPoint);//1 fprintf(fp,"%f,%f,%f\n",d.fXa,d.fYa,d.fZa);//2 fclose(fp); }62[例]格式转换处理一个结构变量.17voidInputData(constchar*filename,CData&d) {FILE*fp=fopen(filename,"r");fscanf(fp,"%d,%f,%d",&d.nLineset,&d.fAdjust,&d.nPoint);fscanf(fp,"%f,%f,%f",&d.fXa,&d.fYa,&d.fZa);//2 fclose(fp);} 6318voidmain(void){CDatas={1,2,3,4,5,6};OutputData("c:\\sdata.out",s);CDatad;InputData("c:\\sdata.out",d);OutputData("c:\\cdata.out",d); }在文件c:\cdata.out中输出结果为:1,2.000000,34.000000,5.000000,6.000000在文件c:\sdata.out中输出结果为:1,2.000000,34.000000,5.000000,6.00000064voidmain(void)19五、出错测试或清除函(feof,ferror,clearerr)1.feof函数测试文件结束标志feof函数的原型为:
intfeof(FILE*stream);该函数的调用格式常为:
while(!feof(stream))读写循环体;2.ferror函数测试流中的错误ferror函数的原型为:
intferror(FILE*stream);3.clearerr函数清除错误标志为0 clearerr函数原型为:
[voidclearerr(FILE*stream);]65五、出错测试或清除函(feof,ferror,clearer
六、字符和字符串读写函数
七、无格式转换的读写函数fread和fwrite
八、文件的定位
九、一个简单的读写存盘程序步骤第13章文件66第13章文件21六、字符和字符串读写函数
1.读取单个字符的fgetc函数
fgetc函数的原型为:intfgetc(FILE*pSrcFile);
FILE*型的入口形参指明读取操作的来源,实参匹配fopen打开的磁盘文件或stdin。该函数从磁盘文件的当前位置读取一个字符,定位源磁盘文件的位置指针向后移动一个字节。如果该指针到达文件末尾,fgetc函数返回EOF。
注意例程getc与函数fgetc作用相同但可以作为函数和宏出现。getchar()例程与getc(stdin)一致,亦可以作为函数和宏出现。67六、字符和字符串读写函数22[例]fgetc.cpp#include<stdio.h>voidmain(void){FILE*fpGet=fopen("fgetc.cpp","r"); if(fpGet==NULL){printf("fopenfailed\n");return;}inti=0; charbuffer[512]; while(feof(fpGet)==0&&i<512)buffer[i++]=fgetc(fpGet); buffer[i]='\0'; printf("%s\n",buffer); //fclose(fpGet); }//程序运行的结果显示fgetc.cpp在屏幕上68[例]fgetc.cpp232.存写单个字符的fputc函数fputc函数的原型为:intfputc(intch,FILE*pDstFile);fputc函数的第一个形参ch正是要存写到第二个形参pDstFile关联的磁盘文件中去的字符,该函数返回第一个入口形参的实参值。pDstFile匹配一个fopen返回的流文件指针或stdout,调用失败返回EOF。692.存写单个字符的fputc函数24[例]fputc.cpp#include<stdio.h>voidmain(void){FILE*fpGet=fopen("fputc.cpp","r");if(fpGet==NULL){printf("fopenfailed\n");return;}FILE*fpPut=fopen("fputc.xpp","w"); if(fpPut==NULL){printf("fop
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026全国职业技能竞赛-人工智能训练师赛项-选拔赛考试题库
- 更年期综合征激素水平变化与规范化诊断评估
- 2026新版二年级上册语文同步单元写话范文
- 探索自考各省历年试题及答案
- 水泥质量检测控制试题及答案
- 动漫知识试题及答案
- 肺癌中医考试题目与答案
- 2026年秋季福州市金城小学教师招聘笔试备考题库及答案详解
- 2026内蒙古地质矿产集团有限公司所属企业招聘226人考试参考题库及答案详解
- 2026年蕲春县网格员招聘考试参考题库及答案解析
- 2026年司法所调解员业务综合考试题及答案
- 2026版抖音视频号直播带货全流程SOP
- 2026人教版五年级数学上册第一单元第1课《观察简单组合体(1)》课件
- 2026年秋季冀人版小学科学四年级上册教学计划
- 人工智能赋能高等教育课程教学改革探索与实践
- 2026年甘肃省中考道德与法治试卷(含答案及解析)
- 江苏省无锡市2025-2026学年四年级下学期6月数学期末调研试题(试卷+答案)
- 部编版七年级上册语文教案全册
- 电气规程中间接头与终端头的制作
- 教辅材料征订申请表
- 2022年中原出版传媒投资控股集团有限公司校园招聘笔试模拟试题及答案解析
评论
0/150
提交评论