版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第12章章 文件操作文件操作第第12章章 文件操作文件操作12.1 文件概念文件概念12.2 文件指针文件指针12.3 打开和关闭文件打开和关闭文件12.4 常用文件操作函数常用文件操作函数习题习题12第第12章章 文件操作文件操作12.1 文件概念文件概念文件是根据特定目的而收集在一起并存储在外部介质上的有关数据的集合。其中外部介质可指硬盘、软盘、磁带、屏幕等。 以前各章中,我们所用到的输入和输出,都是以终端为对象的,即从终端键盘输入数据,运行结果输出到终端上。从操作系统的角度看,每一个与主机相连的输入输出设备都可以看作是一个文件。例如,终端键盘是输入文件,显示器和打印机是输出文件。第第1
2、2章章 文件操作文件操作在程序运行时,常常需要将一些数据(运行的最终结果或中间数据)输出到磁盘上存放起来,以后需要时再从磁盘中输入到计算机内存。这时,就要用到磁盘文件。 C语言把文件看作是一个字符(字节)的序列,即由一个一个字符(字节)的数据顺序组成。根据数据的组织形式,可分为文本文件和二进制文件两类。第第12章章 文件操作文件操作1. 文本文件 文本文件也称为ASCII文件,是指由字符组成的文件,每个字符用其相应的ASCII码存储。这种文件在磁盘中存放时每个字符对应1个字节,用于存放对应的ASCII码。例如,数5678的存储形式为ASCII码 00110101 00110110 001101
3、11 00111000 十进制码 5 6 7 8 共占用4个字节。 文本文件可在屏幕上按字符显示,例如源程序文件就是文本文件,用DOS命令TYPE可显示文件的内容。由于是按字符显示,因此能读懂文件内容。第第12章章 文件操作文件操作2. 二进制文件二进制文件是按二进制的编码方式来存放文件的。例如,数5678的存储形式为00010110 00101110,只占2个字节。二进制文件虽然也可在屏幕上显示,但其内容无法读懂。C语言系统在处理这些文件时,并不区分类型,将其都看成是字符流,只按字节进行处理。 用文本文件形式输出与字符一一对应,一个字节代表一个字符,因而便于对字符进行逐个处理,也便于输出字符
4、。但一般占存储空间较多,而且要花费转换时间(二进制形式与ASCII码间的转换)。第第12章章 文件操作文件操作用二进制形式输出数据,可以节省外存空间和转换时间,但一个字节并不对应一个字符,不能直接输出字符形式。一般中间结果数据需要暂时保存在外存中,以后又需要输入到内存,常用二进制文件保存。第第12章章 文件操作文件操作12.2 文件指针文件指针1. FILE结构体 C语言在使用文件时,系统会在内存中为每一个文件开辟一个区域,用来存放文件的有关信息(如文件的名字、文件状态以及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体名为FILE。Turbo C在stdio.h头文件中有FI
5、LE类型的声明: 第第12章章 文件操作文件操作typedef struct int _fd; /* 文件号 */ int _cleft; /* 缓冲区中剩下的字节数 */ int _mode; /* 文件操作模式 */ char * _nextc; /* 下一个字节的位置 */ char * _buff; /* 文件缓冲区位置 */FILE;第第12章章 文件操作文件操作2. 文件类型指针的定义 用FILE类型可以定义文件类型的指针,例如:FILE *fp;fp为指向结构体类型的指针变量,可以指向一个可操作的文件。换句话说,一个文件有一个文件变量指针,今后对文件的访问,会转化为针对文件变量指
6、针的操作。 如果程序中同时要处理几个文件,则应该定义几个文件类型指针,例如:FILE *fp1 , *fp2 , *fp3 ; 第第12章章 文件操作文件操作12.3 打开和关闭文件打开和关闭文件12.3.1 文件的打开(fopen函数)1. fopen函数的调用方式 ANSI C规定了标准输入输出函数库,用fopen函数实现文件的打开。fopen函数的调用方式通常是FILE *fp;fp=fopen(文件名, 使用文件方式); 例如:FILE *fp;fp=fopen(doc.txt,r);第第12章章 文件操作文件操作它表示要打开名字为doc.txt的文件,文件使用的方式是“只读”,也就是
7、文件doc.txt只能读不能写,用户不能修改文件中的内容。2. 文件名的说明 对于文件名的使用,应注意以下两个方面。 (1) 文件名必须用双引号括起来,如果在当前目录下使用一个文件,则可以不加路径,详见前面的例子。 (2) 如果使用的文件不在当前目录下,则有两种情况。第第12章章 文件操作文件操作 如果在当前目录的子目录下使用某一个文件,则必须加上相对路径。例如,在当前目录下有一个子目录test,如果要以只读方式使用test目录下的一个文件file1.txt,可以这样使用:fp=fopen(testfile1.txt,r);注意,test后面必须用“”,不能用“”。 如果使用的文件在另外一个目
8、录下,此时必须使用绝对路径,例如,在D盘下有一个目录doc,如果要以只写方式使用此目录下的文件file2.txt,可以这样使用:fp=fopen(c:docfile2.txt,w);文件使用方式见表12-1。第第12章章 文件操作文件操作表12-1 文件使用方式打开方式 含 义 说 明 r 只读 为输入打开一个已存在的文本文件 w 只写 为输出打开一个文本文件 a 追加 为追加打开一个已存在的文本文件 rb 只读 为输入打开一个已存在的二进制文件 wb 只写 为输出打开一个二进制文件 ab 追加 为追加打开一个已存在的二进制文件 r+ 读写 为既读又写打开一个已存在的文本文件 w+ 读写 为既
9、读又写新建一个文本文件 a+ 读写 为既读又写打开一个已存在的文本文件,文件指针移至文件末尾 rb+ 读写 为既读又写打开一个已存在的二进制文件 wb+ 读写 为既读又写新建一个二进制文件 ab+ 读写 为既读又写打开一个已存在的二进制文件,文件指针移至文件末尾 第第12章章 文件操作文件操作3. 文件使用方式的说明 在使用fopen函数时,要注意以下几个问题。 (1) 文件使用方式由r、w、a、b和+等5个字符组成,各字符的含义如下。 r(read):读。 w(write):写。a(append):追加。 b(banary):二进制文件。 +:读和写。 (2) 用“r”打开一个文件时,该文件
10、必须已经存在,且只能从该文件读出。 第第12章章 文件操作文件操作 (3) 用“w”打开的文件只能向该文件写入。若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去,重建一个新文件。 (4) 若要向一个已存在的文件追加新的信息,只能用“a”方式打开文件。但此时该文件必须是事先存在的,否则将会出错。 (5) 在打开一个文件时,如果出错,fopen将返回一个空指针值NULL。在程序中可以用这一信息来判别是否完成了打开文件的工作,并作相应的处理。因此常用以下程序段打开文件:第第12章章 文件操作文件操作if(fp=fopen(c:hzk16,rb)=NULL)prin
11、tf(nerror on open c:hzk16 file!);getch( );exit(1);第第12章章 文件操作文件操作这段程序的含义是,如果返回的指针为空,表示不能打开C盘根目录下的hzk16文件,则给出提示信息“error on open c: hzk16 file!”,下一行getch( )的功能是从键盘输入一个字符,但不在屏幕上显示。在这里,该行的作用是等待,只有当用户从键盘敲任一键时,程序才继续执行,因此用户可利用这个等待时间阅读出错提示。敲键后执行exit(1)退出程序。第第12章章 文件操作文件操作 (6) 把一个文本文件读入内存时,要将ASCII码转换成二进制码,而把
12、文件以文本方式写入磁盘时,也要将二进制码转换成ASCII码,因此文本文件的读写要花费较多的转换时间。对二进制文件的读写不存在这种转换。 (7) 标准输入文件(键盘)、标准输出文件(显示器)、标准出错输出(出错信息)是由系统打开的,可直接使用。文件一旦使用完毕,应用关闭文件函数fclose将文件关闭,以免文件数据丢失。第第12章章 文件操作文件操作12.3.2 文件的关闭(fclose函数) 使用完一个文件后,应该关闭该文件,以防止该文件再被误用。“关闭”就是使文件指针变量不指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对其相连的文件进行读写操作,除非再次打开,使该指针变量重
13、新指向该文件。1. 关闭文件的作用 关闭文件的作用有以下两点: (1) 使文件指针fp与文件脱离。 (2) 刷新文件输入输出缓冲区。第第12章章 文件操作文件操作2. 关闭方法 关闭文件用fclose函数来实现。fclose函数的使用格式为fclose(文件指针);其中,文件指针指向要关闭的文件。当文件正常关闭时,函数返回0,否则返回EOF。例如:fclose(fp);第第12章章 文件操作文件操作12.4 常用文件操作函数常用文件操作函数文件打开后,就可以对该文件进行读写操作了。下面介绍几个常用的文件操作函数。12.4.1 文件的输入输出1. 字符方式读写文件(fgetc函数和fputc函数
14、)1) fgetc函数的使用格式 fgetc函数的使用格式为ch=fgetc(fp) ;其中,fp为文件指针变量,ch为字符变量。fgetc函数返回一个读取的字符,当返回EOF时表示文件结束或出错,EOF的值为-1。 第第12章章 文件操作文件操作对于fgetc函数的几点说明: (1) 在fgetc函数调用中,读取的文件必须是以读或读写方式打开的。 (2) 一般情况下,要将读取的字符赋给一个字符变量,读取字符的结果也可以不向字符变量赋值,例如,“fgetc(fp);”,但是读出的字符不能保存。 (3) 在文件内部有一个位置指针,用来指向文件的当前读写字节。在文件打开时,该指针总是指向文件的第一
15、个字节。使用fgetc函数后,该位置指针将向后移动一个字节。因此可连续多次使用fgetc函数,读取多个字符。应注意文件指针和文件内部的位置指针不是一回事。第第12章章 文件操作文件操作 文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的。文件内部的位置指针用以指示文件内部的当前读写位置,每读写一次,该指针均向后移动,它不需在程序中定义说明,而是由系统自动设置的。(4) 在读取二进制文件时,当读取到数据-1时,可能会误解为文件结束,C语言提供了feof函数用于检测文件是否结束。文件结束时,函数返回1,否则返回0。 第第12章章 文件操作文件操作2) fputc函数
16、的使用格式 fputc函数的使用方法为fputc(ch , fp) ;其中,ch为字符变量,fp为文件指针变量。fputc函数将ch的值输出到fp所指的文件中,并返回该字符,如果输出失败则返回EOF。 第第12章章 文件操作文件操作对于fputc函数的几点说明: (1) 被写入的文件可以用写、读写或追加方式打开。用写或读写方式打开一个已存在的文件时,系统将清除原有的文件内容,写入字符从文件首开始。如需保留原有文件内容,希望写入的字符从文件末开始存放,则必须以追加方式打开文件。被写入的文件若不存在,则必须创建该文件。 (2) 每写入一个字符,文件内部位置指针向后移动一个字节。 (3) fputc
17、函数有一个返回值,如写入成功则返回写入的字符,否则返回一个EOF。可用此来判断写入是否成功。第第12章章 文件操作文件操作【例12-1】从文本文件test中顺序读入文件内容,并在屏幕上显示出来。 分析:定义一个文件指针,使用fopen函数以只读方式打开文件test,用fgetc函数从文件中读取字符,并将字符显示在屏幕上。这里要注意如何判断何时到达文件的尾部。 #include stdio.hvoid main( ) FILE *fp; /* 定义文件指针fp */ char ch; fp = fopen(test, r); /* 在当前目录下打开文件test,只读方式 */ if(fp=NUL
18、L) 第第12章章 文件操作文件操作 printf(can not open testn); exit(0); ch = fgetc(fp); /* 读取文件字符,直到文件结束 */ while(ch != EOF) putchar(ch); ch = fgetc(fp); fclose(fp); /* 关闭文件 */第第12章章 文件操作文件操作【例12-2】 新建文件file2.c,将字符串str1中的内容输出到file2.c中, 然后关闭该文件。#include main( )#define m 20 char str1m ; int i ; FILE *fp1 ; if(fp1=fop
19、en(file2.c , w)=NULL)第第12章章 文件操作文件操作 printf(cannot open the filen) ; exit(0) ; scanf(%s , str1) ; i=0 ; while(str1i!=0) fputc(str1i , fp1) ; i+; fclose(fp1) ;第第12章章 文件操作文件操作【例12-3】打开文件file3.c,将字符串string1中的内容添加到文件末尾,然后关闭该文件。#include main( )#define m 20 FILE *fp1 ; char str1m ; int i ; if(fp1=fopen(fi
20、le3.c , a)=NULL) 第第12章章 文件操作文件操作 printf(cannot open the file ) ; exit(0) ; scanf(%s , str1) ; i=0 ; while(str1i!=0) fputc(str1i , fp1) ; i+ ; fclose(fp1) ;第第12章章 文件操作文件操作【例12-4】将一个磁盘文件的内容复制到另一个磁盘文件。#include stdio.h void main( ) FILE *in, *out; /* 定义文件指针in和out */ char ch; char infile10, outfile10; pr
21、intf(Enter the infile namen); /* 提示输入被复制文件的文件名 */ scanf(%s, infile); printf(Enter the outfile namen); /* 提示输入复制文件的文件名 */ 第第12章章 文件操作文件操作 scanf(%s, outfile); if (in = fopen(infile, r)=NULL) /* 以只读方式打开被复制文件 */ printf(can not open infile %sn, infile); exit(0); /* 如果文件不能打开,退出程序 */ if(out = fopen(outfile
22、, w)=NULL) /* 以写方式打开复制文件 */ printf(can not open outfile %sn, outfile); exit(0); 第第12章章 文件操作文件操作while(!feof(in) fputc(fgetc(in), out); /* 将文件内容复制,直到文件结束 */ fclose(in); fclose(out); /* 关闭文件 */ 【例12-5】把命令行所指出的文件连起来输出到文件connect.c中。#include main(argc , argv)int argc ;char *argv ;第第12章章 文件操作文件操作 FILE *sou
23、r1 , *sour2 , *dest ; char ch ; if(argc3) printf(notice:you should enter more filename!n) ; exit(0) ; 第第12章章 文件操作文件操作 if(sour1=fopen(argv1 , r)=NULL) printf(cannot open sourcefile1n!) ; exit(0) ; if(sour2=fopen(argv2 , r)=NULL) printf(cannot open sourcefile2!n) ; exit(0) ; 第第12章章 文件操作文件操作if(dest=fop
24、en(connect.c , w)=NULL) printf(cannot open destinationfile!n) ; exit(0) ; while(!feof(sour1) fputc(fgetc(sour1) , dest) ; while(!feof(sour2) fputc(fgetc(sour2) , dest) ; fclose(sour1) ; fclose(sour2) ; fclose(dest) ;第第12章章 文件操作文件操作 【例12-6】检查命令行所列出的文件中每一行的左括号“(”及右括号“)”是否匹配,如有错误,将错误所在行数写入文件result中。#in
25、clude main(argc , argv)int argc ;char *argv ; FILE *sour , *dest ; int i , j , line , sign , l ; char ch ; 第第12章章 文件操作文件操作if(argc9) ch=ch/10 ; i+ ; 第第12章章 文件操作文件操作 fputc(ch+48 , dest) ; for(j=0 ; ji ; j+) ch=ch*10 ; ch=l-ch ; l=ch ; fputc(n , dest) ; if(sign) printf(success) ;第第12章章 文件操作文件操作2. 字符串方式
26、读写文件(fgets函数和fputs函数)1) fgets函数的使用格式 fgets函数的使用格式为fgets(str,n,fp);其中,str是字符数组名或字符指针,n是一个正整数,fp是文件指针。读字符串函数fgets函数的功能是从fp所指的文件中读出n-1个字符送入字符数组str中。 对fgets函数的两点说明: (1) 在读出n-1个字符之前,如遇到了换行符或EOF,则读出结束。 (2) fgets函数也有返回值,其返回值是字符数组的首地址。第第12章章 文件操作文件操作 【例12-7】从test文件中读入一个含10个字符的字符串。 分析:从test文件中读取10个字符,可以使用fge
27、tc函数,也可以使用fgets函数一次将10个字符读入内存,这里要注意应该读取11个字符,最后一个字符是字符串结束标志。#include main( ) FILE *fp; /* 定义文件指针fp */ char str11;第第12章章 文件操作文件操作if(fp=fopen(test,r)=NULL) /* 以只读方式打开文件test */ printf(Can not open file strike any key exit!); getch( ); exit(1); /* 如果文件不能打开,则退出 */ fgets(str,11,fp); /* 从test文件中取出10个字符赋予st
28、r,并将“0”放在数组的最后元素中 */ printf(%s,str); fclose(fp);第第12章章 文件操作文件操作本例定义了一个字符数组str共11个字节,在以读文本文件方式打开文件test后,从中读出10个字符送入str数组,在数组最后一个单元内将加上0,然后在屏幕上显示输出str数组。2) fputs函数的使用格式 fputs函数的使用格式为fputs(str,fp);其中,str为字符串或是字符数组,fp为文件指针。函数fputs的功能是将字符串或字符数组复制到fp指向的文件中。第第12章章 文件操作文件操作【例12-8】将输入的字符串添加到test文件的尾部。 分析:因为要
29、将字符串添加到文件的尾部,所以文件test的打开方式应是“a+”,对于本例还要注意,输出文件的内容前须将文件指针指向文件的开始位置。#include main( ) FILE *fp; char ch,st20; if(fp=fopen(test,a+)=NULL) /* 以追加的方式打开文件test */ 第第12章章 文件操作文件操作 printf(Cannot open file strike any key exit!); getch( ); exit(1); /* 如果无法打开文件,则退出程序 */ printf(input a string:n); scanf(%s,st); /*
30、 输入字符串 */ fputs(st,fp); /* 将字符串追加到文件的尾部 */ rewind(fp); /* 使文件指针回到文件的头部 */第第12章章 文件操作文件操作ch=fgetc(fp); while(ch!=EOF) putchar(ch); /* 输出新产生的文件 */ ch=fgetc(fp); printf(n); fclose(fp);第第12章章 文件操作文件操作3. 二进制文件的输入与输出(fread函数和fwrite函数) 如果文件用二进制形式打开,则使用fread函数和fwrite函数可以一次读入或写入多组数据(例如一个结构体变量的值或一实数)。1) fread
31、函数的调用 读数据块函数调用的一般形式为fread(buffer,size,count,fp);2) fwrite函数的调用 写数据块函数调用的一般形式为fwrite(buffer,size,count,fp); 第第12章章 文件操作文件操作其中,buffer是一个指针,在fread函数中,它表示存放输入数据的首地址;在fwrite函数中,它表示存放输出数据的首地址。size表示数据块的字节数,count表示要读写的数据块块数,fp表示文件指针。例如:fread(bf,4,5,fp);其含义是从fp所指的文件中,每次读4个字节(一个实数)送入bf指向的内存中,连续读5次,即读5个实数到bf指
32、向的内存中。第第12章章 文件操作文件操作【例12-9】从键盘输入两个学生数据(姓名、学号、年龄和家庭住址),将数据写入一个文件中,再读出这两个学生的数据,并显示在屏幕上。 分析:向文件写入数据时使用fwrite函数,从文件中读取数据时使用fread函数。#include stdio.hstruct stu char name10; int num; int age; char addr20;student12,student22,*pb1,*pb2; /*定义结构体数组student1和student2,用来存放学生的数据*/第第12章章 文件操作文件操作main( ) FILE *fp;
33、/* 定义文件指针fp */ char ch; int i; pb1=student1; pb2=student2; if(fp=fopen(stu_data,wb+)=NULL) /* 以读写方式打开二进制文件stu_data */ printf(Cannot open file strike any key exit!); exit(0); /* 如果无法打开文件,则退出程序 */ 第第12章章 文件操作文件操作printf(ninput datan); for(i=0;iname,&pb1-num,&pb1-age,pb1-addr); /* 输入学生的数据 */ pb1
34、=student1; /* 指针重新指向student1 */ fwrite(pb1,sizeof(struct stu),2,fp); /* 将学生的数据存入文件中 */ rewind(fp); /* 文件指针回到文件首位置 */ fread(pb2,sizeof(struct stu),2,fp); /* 将数据读入student2数组中*/ 第第12章章 文件操作文件操作printf(nnnametnumbertagetaddrn); for(i=0;iname,pb2-num,pb2-age,pb2-addr); fclose(fp); 本例程序定义了一个结构体类型stu,并定义了两个
35、结构体数组student1和student2以及两个结构指针变量pb1和pb2。pb1指向student1,pb2指向student2。程序以读写方式打开二进制文件“stu_data”,输入两个学生数据之后,写入该文件中,然后把文件内部位置指针移到文件首,读出两个学生数据后,在屏幕上显示。 第第12章章 文件操作文件操作【例12-10】定义一个包含学生信息的结构体变量,其中有学号、姓名、年龄和班级等几个域,每次利用fread函数从文件中读入一个记录,当年龄小于20岁时打印出来。#include struct studentint number ; char name10 ; int age ;
36、 char class10 ; ;第第12章章 文件操作文件操作main( ) FILE *fp ; struct student s ; int size ; size=sizeof(struct student) ; if(fp=fopen(student , rb)=NULL) printf(cannot open the file!) ; exit(0) ; 第第12章章 文件操作文件操作while(!feof(fp) fread(&s , size , 1 , fp) ; if(s.age20) printf(%d %s %d %sn , s.number ,
37、, s.age , s.class) ; fclose(fp) ;第第12章章 文件操作文件操作【例12-11】某公司新进一批电脑,文件comrec中存储了这批电脑的信息,设文件有如下记录:type:01price:7999number:30type:02price:8999number:20type:03price:11000number:10type:04price:16000number:5请将price number进行累加。#include struct computer char type10 ; double price ; int number ; ;第第12章章 文件操作文件
38、操作main( )FILE *fp ;struct computer c ;int size ;double sum ;sum=0 ;size=sizeof(struct computer) ;if(fp=fopen(comrec , rb)=NULL)第第12章章 文件操作文件操作 printf(cannot open the file!) ; exit(0) ; while(!feof(fp) fread(&c , size , 1 , fp) ; sum+=c.price*c.number ; /* 计算总价 */ printf(the sum is:%f , sum) ;fcl
39、ose(fp) ;第第12章章 文件操作文件操作4. 文件格式化的输入与输出(fscanf函数和fprintf函数) fscanf函数和fprintf函数与前面使用的scanf和printf函数的功能相似,都是格式化读写函数。两者的区别在于fscanf函数和fprintf函数的读写对象不是键盘和显示器,而是磁盘文件。1) fscanf函数的调用 fscanf函数的调用格式为fscanf(文件指针,格式字符串,输入表列);2) fprintf函数的调用 fprintf函数的调用格式为printf(文件指针,格式字符串,输出表列);第第12章章 文件操作文件操作 例如:fscanf(fp,%d%s
40、,&i,s); /* 从fp指向的文件中读取的数据分别放在i和s指向的内存中 */fprintf(fp,%d%c,j,ch); /* 将j和ch中的数据存入fp指向的文件中 */第第12章章 文件操作文件操作 【例12-12】从键盘输入两个学生数据(姓名、学号、年龄和家庭住址),将数组写入一个文件中,再读出这两个学生的数据,并显示在屏幕上。#include stdio.hmain( ) FILE *fp; int i; struct stu /* 定义结构体类型 */ char name15; char num6; float score2; student; /* 说明结构体变量st
41、udent */第第12章章 文件操作文件操作if(fp=fopen(test1.txt,w)=NULL) /* 以文本只写方式打开文件 */ printf(cannot open file); exit(0); printf(input data:n); for( i=0;i2;i+) scanf(%s %s %f %f,,student.num,&student.score0,&student.score1); 第第12章章 文件操作文件操作/* 从键盘输入 */ f p r i n t f ( f p , % s % s % 7 . 2 f %7.
42、2fn,,student.num,student.score0,student.score1);/* 写入文件 */ fclose(fp); /* 关闭文件 */ if(fp=fopen(test.txt,r)=NULL) /* 以文本只读方式重新打开文件 */ printf(cannot open file); exit(0); 第第12章章 文件操作文件操作printf(output from file:n); while(fscanf(fp,%s%s%f%fn,,student.num,&student.score0,student
43、.score1)!=EOF)/* 从文件读入 */ p r i n t f ( % s % s % 7 . 2 f %7.2fn,,student.num,student.score0,student.score1); /* 显示到屏幕 */fclose(fp); /* 关闭文件 */第第12章章 文件操作文件操作【例12-13】在学生文件中存有如下信息,包括学号、课程和成绩。调出这些学生信息,将成绩不及格(60分)的学号输出到文件stu1中。 # include struct student int number ; char cname10 ; int scorce
44、 ; ;main( ) FILE *fp , *fp1 ; struct student s ; int size ; size=sizeof(struct student) ; if(fp=fopen(student , rb)=NULL)第第12章章 文件操作文件操作 printf(cannot open the file!) ; exit(0) ; if(fp1=fopen(stu1 , wb)=NULL) printf(cannot open stu1!) ; exit(0) ; 第第12章章 文件操作文件操作while(!feof(fp) fread(&s , size ,
45、1 , fp) ; if(s.scorce60) printf(fp1 , %d %s %dn , s.number , ame , s.scorce) ; fclose(fp) ;第第12章章 文件操作文件操作5. 随机读写函数(rewind函数和fseek函数)前面介绍的对文件的读写方式都是顺序读写,即读写文件只能从头开始,顺序读写各个数据。但在实际问题中常要求只读写文件中某一指定的部分。为了解决这个问题,可移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写称为随机读写。实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。文件定位移动文件内部位置指针的函数主要有两个,即r
46、ewind函数和fseek函数。第第12章章 文件操作文件操作1) rewind函数的调用 rewind函数的功能是把文件内部的位置指针移到文件首。它的调用格式是rewind(文件指针);2) fseek函数的调用 fseek函数用来移动文件内部位置指针,其调用格式是fseek(文件指针,位移量,起始点);其中,“文件指针”指向被移动的文件。“位移量”表示移动的字节数,要求位移量是long型数据,以便在文件长度大于64 KB时不会出错。当用常量表示位移量时,要求加后缀“L”。“起始点”表示从何处开始计算位移量,规定的起始点有3种:文件首,当前位置和文件尾。其表示方法见表12-2。第第12章章
47、文件操作文件操作表12-2 文 件 指 针打开方式 含 义 说 明 r 只读 为输入打开一个已存在的文本文件 w 只写 为输出打开一个文本文件 a 追加 为追加打开一个已存在的文本文件 rb 只读 为输入打开一个已存在的二进制文件 wb 只写 为输出打开一个二进制文件 ab 追加 为追加打开一个已存在的二进制文件 r+ 读写 为既读又写打开一个已存在的文本文件 w+ 读写 为既读又写新建一个文本文件 a+ 读写 为既读又写打开一个已存在的文本文件,文件指针移至文件末尾 rb+ 读写 为既读又写打开一个已存在的二进制文件 wb+ 读写 为既读又写新建一个二进制文件 ab+ 读写 为既读又写打开一
48、个已存在的二进制文件,文件指针移至文件末尾 第第12章章 文件操作文件操作 例如:fseek(fp,200L,0);其含义是把位置指针移到离文件首200个字节处。还要说明的是,fseek函数一般用于二进制文件。在文本文件中由于要进行转换,故往往计算的位置会出现错误。文件的随机读写在移动位置指针之后,即可用前面介绍的任一种读写函数进行读写。由于一般是读写一个数据块,因此常用fread和fwrite函数。第第12章章 文件操作文件操作 【例12-14】 写入3个学生记录,记录内容为学生姓名、学号和两科成绩。写入成功后,随机读取第3条记录,并用第2条记录替换。分析:使用结构体stu数据student
49、存放3个学生的基本情况,使用fwrite函数将学生的基本情况存入文件“test.txt”中,使用fseek函数定位第3条记录,并用第2条记录替换它。 第第12章章 文件操作文件操作#include stdio.h#include stdlib.hstruct stuchar name10;char num6;float score2;第第12章章 文件操作文件操作main( ) FILE *fp1; /* 定义文件指针 */ char *temp; int i,j;StructStustudent3=wang,1001,60,61,zhang,1002,70,71,li,1003,80,81;
50、 if(fp1=fopen(test.txt,wb)=NULL) /* 以二进制只写方式打开文件 */ printf(cannot open file); exit(0); 第第12章章 文件操作文件操作for(i=0;i3;i+) fwrite(&studenti,sizeof(struct stu),1,fp1);/* 成块写入 */ fclose(fp1); /* 关闭 */ if(fp1=fopen(test.txt,rb+)=NULL) /* 以可读写方式打开文件 */ printf(cannot open file); exit(0); printf(-n); p r i
51、n t f ( % - 1 5 s % - 7 s % - 7 s % -7sn,name,num,score1,score2); printf(-n);第第12章章 文件操作文件操作for(i=0;i3;i+) /* 显示全部文件内容 */ fread(&studenti,sizeof(struct stu),1,fp1); printf(%-15s%-7s%7.2f%7.2fn,,studenti.num,studenti.score0,studenti.score1); 第第12章章 文件操作文件操作/* 以下进行文件的随机读写 */ fseek(fp1
52、,2*sizeof(struct stu),0); /* 定位文件指针指向第3条记录 */ fwrite(&student1,sizeof(struct stu),1,fp1); /* 在第三条记录处写入第二条记录 */ rewind(fp1); /* 移动文件指针到文件头 */ printf(-n); p r i n t f ( % - 1 5 s % - 7 s % - 7 s % -7sn,name,num,score1,score2);第第12章章 文件操作文件操作 printf(-n); for (i=0;i3;i+) /* 重新输出文件内容 */ fread(&st
53、udenti,sizeof(struct stu),1,fp1); printf(%-15s%-7s%7.2f%7.2fn,,studenti.num,studenti.score0,studenti.score1); fclose(fp1); /* 关闭文件 */第第12章章 文件操作文件操作 【例12-15】有一磁盘文件file1,将该文件复制到另一磁盘文件file2中。其中第1至第3个字符要连续复制5次。#include main(argc , argv)int argc ;char *argv ;FILE *sour , *dest ;char ch ;int
54、 i , j ;if(argc3)第第12章章 文件操作文件操作 printf(notice : you have to enter more filename!n) ; exit(0) ; if(sour=fopen(argv1 , r)=NULL) printf(cannot open soursefile!n) ; exit(0) ; 第第12章章 文件操作文件操作if(dest=fopen(argv2 , w)=NULL) printf(cannot open destinationfile!n) ; exit(0) ; for(i=1 ; i6 ; i+) for(j=1 ; j4
55、; j+) fputc(fgetc(sour) , dest) ; 第第12章章 文件操作文件操作 rewind(sour) ; /* 复制第1至第3个字符一遍后,指针重新指向文件开头 */ while(!feof(sour) fputc(fgetc(sour) , dest) ;fclose(sour) ;fclose(dest) ;第第12章章 文件操作文件操作【例12-16】向文件末尾添加一条记录。#include struct student int number ; char name10 ; int age ; char class10 ; ;main( ) FILE *fp ;
56、struct student s ; int i , size ; size=sizeof(struct student) ; if(fp=fopen(student , ab)=NULL)第第12章章 文件操作文件操作 printf(cannot open the file!) ; exit(0) ; fseek(fp , 0l , SEEK_END) ;printf(number:) ;scanf(%d , &s.number) ;printf(name:) ;scanf(%s , &) ;printf(age:) ;第第12章章 文件操作文件操作scanf(%
57、d , &s.age) ;printf(class:) ;scanf(%s , &s.class) ;fwrite(&s , size , 1 , fp) ;fclose(fp) ;第第12章章 文件操作文件操作【例12-17】向一个有序文件(从小到大的顺序)中插入一条记录。#include struct student int number ; char name10 ; int age ; char class10 ; ;main( )FILE *fp ;struct student s , d ;int i , size ;size=sizeof(struct student) ;第第12章章 文件操作文件操作if(fp=fopen(student , ab+)=NULL) printf(cannot open the file!) ; exit(0) ; rewind(fp) ;printf(number:) ;scanf(%d , &s.number) ;printf(name:) ;scanf(%s , &) ;printf(age:) ;第第12章章 文件操作文件操作scanf(%d , &s.age) ;prin
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024三个小孩抚养权协议及共同财产分割合同6篇
- 2025年服装机械项目申请报告模板
- 2024-2025学年新疆维吾尔阿勒泰地区数学三上期末统考模拟试题含解析
- 2024-2025学年武功县数学三年级第一学期期末联考试题含解析
- 去工厂实习报告模板十篇
- 2024年消防喷淋安装施工总承包合同文件
- 超市的实习报告四篇
- 2025年伺服系统项目申请报告模稿
- 2025年咖啡机项目规划申请报告
- 2024年度水电供应专用合同合同一
- 《正态分布理论及其应用研究》4200字(论文)
- GB/T 45086.1-2024车载定位系统技术要求及试验方法第1部分:卫星定位
- 支气管动脉造影护理
- 1古诗文理解性默写(教师卷)
- 广东省广州市越秀区2021-2022学年九年级上学期期末道德与法治试题(含答案)
- 校园春季安全
- 2024-2025学年六上科学期末综合检测卷(含答案)
- 【MOOC】工程力学-浙江大学 中国大学慕课MOOC答案
- 在线教育平台合作合同助力教育公平
- 2024年湖南省公务员考试《行测》真题及答案解析
- 产房年终总结及明年计划
评论
0/150
提交评论