文件操作有以下几个内容: 1.将数据从内存输出到文件上,也称“写”文件。 2.将数据从文件输入到内存,也称“读”文件。 一.怎样进行文件操作: 1.设立文件指针 进行文件操作时,必须在程序一开始就先定义文件指针。 FILE *指针类型变量 2.打开文件 将文件指针与磁盘上的文件建立联系,以后对文件的所有操作都将通过文件指针来进行 fopen(文件名, 使用文件方式) 比如: fp = fopen("A.TXT","r"); 其中A.TXT表示将要访问的是当前盘当前路径下名为A.TXT的文件。 fopen()函数调用成功,表示在指定的磁盘位置找到文件A.TXT,这时将带回指向A.TXT文件的指针并赋给 fp,这样fp就和文件A.TXT建立了联系。 如果文件打开不成功,fopen()函数将返回一个空指针NULL,为了避免使用空指针,应该按下面的程序段 的书写形式输出失败信息: if( fp=fopen("A.TXT","r") == NULL) { printf("can't find this file!\n"); exit(0); } ------------------------------------------------------------------------------------------------- 文件使用方式 含义 "r"(只读) 为输入打开一个文本文件。若指定的文件不存在,则会出错 "w"(只写) 为输出打开一个文本文件。若文件不存在,系统将用指定名建立一个新文件;若文件已经存 在,则将从起始位置重新写,原有内容被更新 "rb"(只读) 为输入打开一个二进制文件。功能与"r"相同 "wb"(只写) 为输出打开一个二进制文件。功能与"w"相同 "a"(追加) 为追加数据打开一个文本文件。若文件不存在,系统将用指定名建立一个新文件;若文件已 经存在,则新数据写在原有内容之后 "ab"(追加) 为追加数据打开一个二进制文件。其余功能与"a"相同 "r+"(读写) 为读/写打开一个已存在文本文件。既可读,也可写,读写总是从文件的起始位置开始;更换 读写操作时不必关闭文件 "rb+"(读写) 为读/写打开一个已存在的二进制文件。功能与"r+"相同。可由位置函数设置读写的起始位置 "w+"(读写) 为读/写建立一个新的文本文件。若文件已存在,原有内容将被更新 "wb+"(读写) 为读/写建立一个新的二进制文件。功能与"w+"相同;可由位置函数设置读写起始位置 "a+"(读写) 为读/写打开一个文本文件。功能与"a"相同,只是在文件尾部添加新数据后,可以从头开始 读 "ab+"(读写) 为读/写打开一个二进制文件。功能与"a+"相同,只是在文件尾部添加新数据之后,可由位置 函数设置开始读的起始位置 ------------------------------------------------------------------------------------------------- 二.读、写数据: 读写数据将通过调用标准输入输出函数来完成。这些函数主要包括: (1)fgetc()和getc():从制定文件中一次读取一个字符 fputc()和putc():一次输出一个字符到指定文件 (2)fgets():从指定文件中一次读取一个字符串 fputs():一次输出一个字符串到指定文件 (3)fread():从指定文件中一次读取一个数据块 fwrite():一次输出一个数据块到指定文件 (4)fscanf():从指定文件中按格式读取数据 fprintf():按指定格式将数据输出到指定文件中 文件定位函数,使“读写位置指针”直接指向指定的读写位置: fseek():可移动位置指针到指定位置上 ftell():可获得当前位置指针的位置 rewind():“反绕”函数,可使位置指针回到文件的开头 三.关闭文件 当 读、写操作完成之后,必须先将先将文件关闭 fclose(文件指针) 函数调用成功后返回0,否则返回非0值 --------------------------------------------------------------------------------------------------------------------------------------------- 怎样向文本文件写入单个字符: #include <stdio.h> main() { FILE *fpc; //定义文件指针 char ch; if( (fpc = fopen("A1.TXT","w")) == NULL ) //文件打开不成功就退出程序的执行 { printf("can't open this file!!\n"); exit(0); } ch = getchar(); while( ch != '@') { fputc(ch, fpc); ch = getchar(); } fclose(fpc); } 上例表达式fopen("A1.TXT","w")是: 为“只写”而打开一个名为"A1.TXT"的文本文件,程序执行后,如果当前目录下没有名字为A1.TXT的文件,系统将在该目录下新建;如果已经存在,则从文件的其始位置重新写,文件中所有原有内容全部更新。 ---------------------------------------------------------------------------------------------------------------------------------------------- 5.向文本文件写入字符串 #include <stdio.h> main() { FILE *fps; char str[8]; if( (fps=fopen("A2.TXT","a")) == NULL) { printf("can't open this file!\n"); exit(0); } while( strlen( gets(str)>0 ) { fputs(str,fps); fputs("\n",fps); } fclose(fps); printf("\n"); } ---------------------------------------------------------------------------------------------------------------------------------------------- 4.从文本文件中读取单个字符 #include <stdio.h> main() { FILE *fpc; char ch; if( (fpc=fopen("A1.TXT","r")) == NULL) { printf("can't open this file!\n"); exit(0); } ch = fgetc(fpc); while( ch!=EOF) { putchar(ch); ch = fgetc(fpc); } fclose(fpc); putchar("\n"); } ---------------------------------------------------------------------------------------------------------------------------------------------- 文件函数 函数名 函数原型说明 功能 返回值 --------------------------------------------------------------------------------------------- fopen FILE *fopen(char 以mode指定的方式打开名 成功返回文件指针(文件 *filename, 为filename的文件 信息区的其始地址),否则 char *mode); 返回NULL 例: --------------------------------------------------------------------------------------------- fclose int fcolse(FILE *fp); 关闭fp所指的文件,释放文件缓冲区 出错返回非0,否则返回0 例: ---------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------- 格式化写文件 #include <stdio.h> void num(FILE *); main() { FILE *fp; char *fname; fname = "NUM.TXT"; if( (fp = fopen(fname,"w")) == NULL ) { printf("Can't open this file ! \n"); exit(0); } num(fp); fclose(fp); } void num(FILE *fp) { char name[20]; int num; scanf("%s%d",name,&num); while(nu>o) { fprintf( fp, "%s %d\n", name, num); scanf("%s%d",name,&num); } } ---------------------------------------------------------------------------------------------------------------------------------------------- 格式化读文件 #include <stdio.h> void num(FILE *); main() { FILE *fp; char *fname; fname = "NUM.TXT" if( (fp = fopen(fname,"r")) == NULL ) { prinf("can't open this file ! \n"); exit(0); } num(fp); fclose(fp); } void num(FILE *f) { char name[20]; int nu; fscanf(f,"%s%d",name,&nu); while(!feof(f)) { printf("%s %d\n", name, nu); fscanf(f,"%s%d",name,&d); } } ---------------------------------------------------------------------------------------------------------------------------------------------- 文件的数据块读写方式 按数据块方式对一个二进制文件进行读写操作的例子: /*文件的数据块读写 by searcher 2002-9-12 */ #include <string.h> #include <stdio.h> struct student { char name[20]; int num; char sex; struct { int year; int month; int day; }birthday; float cj[3]; }; main() { struct student pes[3] = {{"wanghai",1015,'M',1985,2,22,80,95,60.5},{"haixin",1017,'F', 1984,1,2,57,60,78},{"lili",1019,'F',1984,3,2,77.0,90,77.5}}; int i; FILE *fpr; struct student b; fpr = fopen("W.DAT","wb+"); for(i=0;i<3;i++) fwrite(pes+i,sizeof(struct student),1,fpr); fseek(fpr,0L,SEEK_SET); for(i=0;i<3;i++) { fread(&b,sizeof(struct student),1,fpr); printf("%7s ",b.name); printf("%c ",b.sex); printf("%d %d %2d",b.birthday.year,b.birthday.month,b.birthday.day); printf("%5.1f %5.1f %5.1f",b.cj[0],b.cj[1],b.cj[2]); printf("\n"); } getchar(); fclose(fpr); } //fwrite()和fread()一般用于二进制文件 //fread(&b,sizeof(struct student),1,fpr)中,第一个参数表示b的地址,第二个参数表示一次所读取 //的数据块的字节数,第三个参数是数字1,表示每次读取一个数据块,最后一个为文件指针 ----------------------------------------------------------------------------------------------------------------------------------------------- 文件复制方法 /*文件复制 by searcher 2002-9-12*/ #include <stdio.h> #include <stdlib.h> void filecp(FILE *,FILE *); void main(int argc, char *argv[]) { FILE *fpin, *fpout; printf("argc= %d\n",argc); if(argc < 3) { printf("cmdline outto get at less than 3 cmd!\n"); exit(0); } if(argc > 3) { printf("cmdline outto get 3 cmd! \n"); exit(0); } if(argc == 3) { if( (fpin = fopen(argv[1],"r")) == NULL ) { printf("can't open file! \n"); exit(0); } if( (fpout = fopen(argv[2],"w")) == NULL) { printf("can't open file! \n"); exit(0); } filecp(fpin,fpout); fclose(fpin); fclose(fpout); } else printf("error!\n"); } void filecp(FILE *fpin, FILE *fpout) { char ch; ch = getc(fpin); while(!feof(fpin)) { putc(ch,fpout); ch = getc(fpin); } } 上面的程序总有问题,程序运行时命令行参数argc的个数为什么总是1呢?????? 所以,运行结果也总是:"error!" ----------------------------------------------------------------------------------------------------------------------------------------------- 文件定位函数 1.fseek()函数: 用来移动文件位置指针到指定的位置上,从此位置接着读、写操作。函数的调用形式如下: fseek(pf, offset, origin) pf是文件指针,offset是以字节为单位的位移量,为长整型数;origin是起始点, 用以指定位移量是以哪个位置为基准的,起始点既可用标识符来表示,也可用数字 来代表。 标识符 数字 代表的起始点 SEEK_SET 0 文件开始 SEEK_END 2 文件末尾 SEEK_CUR 1 文件当前位置 例如: fp已指向一个二进制文件,能使位置指针从文件的开头向文件尾部移动20个字节的fseek()函数的 调用形式如下: fseek(fp, 20L, SEEK_SET) 例如: fp已指向一个二进制文件,能使位置指针从文件尾部向文件开头移动10个sizeof(int)的函数的调 用形式如下: fseek(fp, -10L*sizeof(int), SEEK_END) 对于文本文件,位移量必须为0。 例如:fp已指向一个文本文件,能使位置指针移到文件起始位置的fseek()函数形式如下: fseek(fp, 0L, SEEK_SET) 例如:fp以指向一个文本文件,能使位置指针移到文件末尾的fseek()函数的调用形式如下: fseek(fp, 0L, SEEK_END) 2.ftell()函数: 调用ftell()函数可以得到当前位置指针相对于文件起始位置的字节数。函数调用出错时,返回-1L. 例如:当打开一个文件时,通常并不知道该文件的长度,通过以下程序段可以求出该文件的字节数: fseek(fp, 0L, SEEK_END); //把位置指针移到文件末尾 t = ftell(fp); //求出文件的总字节数 再例如:某二进制文件中存放的struct st结构体类型数据,可以通过以下程序,可求出该结构体类型 数据块的个数: fseek(fp, 0L, SEEK_END); t = ftell(fp); n = t/sizeof(struct st); 3.rewind()函数: 又称“反绕”函数,能使位置指针回到文件的开头。函数调用形式如下: rewind(fp); fp为文件指针,此函数没有返回值。
|