版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第12章章 文件操作文件操作 第第12章章 文件操作文件操作 12.1 文件概念文件概念 12.2 文件指针文件指针 12.3 打开和关闭文件打开和关闭文件 12.4 常用文件操作函数常用文件操作函数 习题习题12 第第12章章 文件操作文件操作 12.1 文件概念文件概念 文件是根据特定目的而收集在一起并存储在外部介质 上的有关数据的集合。其中外部介质可指硬盘、软盘、磁 带、屏幕等。 以前各章中,我们所用到的输入和输出,都是以终端 为对象的,即从终端键盘输入数据,运行结果输出到终端 上。从操作系统的角度看,每一个与主机相连的输入输出 设备都可以看作是一个文件。例如,终端键盘是输入文件, 显
2、示器和打印机是输出文件。 第第12章章 文件操作文件操作 在程序运行时,常常需要将一些数据(运行的最终结 果或中间数据)输出到磁盘上存放起来,以后需要时再从 磁盘中输入到计算机内存。这时,就要用到磁盘文件。 C语言把文件看作是一个字符(字节)的序列,即由一 个一个字符(字节)的数据顺序组成。根据数据的组织形式, 可分为文本文件和二进制文件两类。 第第12章章 文件操作文件操作 1. 文本文件 文本文件也称为ASCII文件,是指由字符组成的文件, 每个字符用其相应的ASCII码存储。这种文件在磁盘中存放 时每个字符对应1个字节,用于存放对应的ASCII码。例如, 数5678的存储形式为 ASCI
3、I码 00110101 00110110 00110111 00111000 十进制码 5 6 7 8 共占用4个字节。 文本文件可在屏幕上按字符显示,例如源程序文件就是 文本文件,用DOS命令TYPE可显示文件的内容。由于是按 字符显示,因此能读懂文件内容。 第第12章章 文件操作文件操作 2. 二进制文件 二进制文件是按二进制的编码方式来存放文件的。例如, 数5678的存储形式为 00010110 00101110,只占2个字节。二进制文件虽然也可 在屏幕上显示,但其内容无法读懂。C语言系统在处理这些文 件时,并不区分类型,将其都看成是字符流,只按字节进行 处理。 用文本文件形式输出与字符
4、一一对应,一个字节代表一 个字符,因而便于对字符进行逐个处理,也便于输出字符。 但一般占存储空间较多,而且要花费转换时间(二进制形式与 ASCII码间的转换)。 第第12章章 文件操作文件操作 用二进制形式输出数据,可以节省外存空间和转换 时间,但一个字节并不对应一个字符,不能直接输出字 符形式。一般中间结果数据需要暂时保存在外存中,以 后又需要输入到内存,常用二进制文件保存。 第第12章章 文件操作文件操作 12.2 文件指针文件指针 1. FILE结构体 C语言在使用文件时,系统会在内存中为每一个文 件开辟一个区域,用来存放文件的有关信息(如文件的 名字、文件状态以及文件当前的位置等)。这
5、些信息是 保存在一个结构体变量中的。该结构体名为FILE。 Turbo C在stdio.h头文件中有FILE类型的声明: 第第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;
7、fp=fopen(doc.txt,r); 第第12章章 文件操作文件操作 它表示要打开名字为doc.txt的文件,文件使用的方式 是“只读”,也就是文件doc.txt只能读不能写,用户不能 修改文件中的内容。 2. 文件名的说明 对于文件名的使用,应注意以下两个方面。 (1) 文件名必须用双引号括起来,如果在当前目录下使 用一个文件,则可以不加路径,详见前面的例子。 (2) 如果使用的文件不在当前目录下,则有两种情况。 第第12章章 文件操作文件操作 如果在当前目录的子目录下使用某一个文件,则必 须加上相对路径。例如,在当前目录下有一个子目录test, 如果要以只读方式使用test目录下的一个
8、文件file1.txt,可以 这样使用: fp=fopen(testfile1.txt,r); 注意,test后面必须用“”,不能用“”。 如果使用的文件在另外一个目录下,此时必须使用 绝对路径,例如,在D盘下有一个目录doc,如果要以只写 方式使用此目录下的文件file2.txt,可以这样使用: fp=fopen(c:docfile2.txt,w); 文件使用方式见表12-1。 第第12章章 文件操作文件操作 表12-1 文件使用方式 打开方式 含 义 说 明 r 只读 为输入打开一个已存在的文本文件 w 只写 为输出打开一个文本文件 a 追加 为追加打开一个已存在的文本文件 rb 只读 为
9、输入打开一个已存在的二进制文件 wb 只写 为输出打开一个二进制文件 ab 追加 为追加打开一个已存在的二进制文件 r+ 读写 为既读又写打开一个已存在的文本文件 w+ 读写 为既读又写新建一个文本文件 a+ 读写 为既读又写打开一个已存在的文本文件,文件指针移至文件末尾 rb+ 读写 为既读又写打开一个已存在的二进制文件 wb+ 读写 为既读又写新建一个二进制文件 ab+ 读写 为既读又写打开一个已存在的二进制文件,文件指针移至文件末尾 第第12章章 文件操作文件操作 3. 文件使用方式的说明 在使用fopen函数时,要注意以下几个问题。 (1) 文件使用方式由r、w、a、b和+等5个字符组
10、成, 各字符的含义如下。 r(read):读。 w(write):写。 a(append):追加。 b(banary):二进制文件。 +:读和写。 (2) 用“r”打开一个文件时,该文件必须已经存在, 且只能从该文件读出。 第第12章章 文件操作文件操作 (3) 用“w”打开的文件只能向该文件写入。若打开的 文件不存在,则以指定的文件名建立该文件,若打开的文 件已经存在,则将该文件删去,重建一个新文件。 (4) 若要向一个已存在的文件追加新的信息,只能用 “a”方式打开文件。但此时该文件必须是事先存在的,否 则将会出错。 (5) 在打开一个文件时,如果出错,fopen将返回一个 空指针值NUL
11、L。在程序中可以用这一信息来判别是否完 成了打开文件的工作,并作相应的处理。因此常用以下程 序段打开文件: 第第12章章 文件操作文件操作 if(fp=fopen(c:hzk16,rb)=NULL) printf(nerror on open c:hzk16 file!); getch( ); exit(1); 第第12章章 文件操作文件操作 这段程序的含义是,如果返回的指针为空,表示不能 打开C盘根目录下的hzk16文件,则给出提示信息“error on open c: hzk16 file!”,下一行getch( )的功能是从键盘输 入一个字符,但不在屏幕上显示。在这里,该行的作用是 等待
12、,只有当用户从键盘敲任一键时,程序才继续执行, 因此用户可利用这个等待时间阅读出错提示。敲键后执行 exit(1)退出程序。 第第12章章 文件操作文件操作 (6) 把一个文本文件读入内存时,要将ASCII码转换成 二进制码,而把文件以文本方式写入磁盘时,也要将二进 制码转换成ASCII码,因此文本文件的读写要花费较多的 转换时间。对二进制文件的读写不存在这种转换。 (7) 标准输入文件(键盘)、标准输出文件(显示器)、标 准出错输出(出错信息)是由系统打开的,可直接使用。文 件一旦使用完毕,应用关闭文件函数fclose将文件关闭, 以免文件数据丢失。 第第12章章 文件操作文件操作 12.3
13、.2 文件的关闭(fclose函数) 使用完一个文件后,应该关闭该文件,以防止该 文件再被误用。“关闭”就是使文件指针变量不指向 该文件,也就是文件指针变量与文件“脱钩”,此后 不能再通过该指针对其相连的文件进行读写操作,除 非再次打开,使该指针变量重新指向该文件。 1. 关闭文件的作用 关闭文件的作用有以下两点: (1) 使文件指针fp与文件脱离。 (2) 刷新文件输入输出缓冲区。 第第12章章 文件操作文件操作 2. 关闭方法 关闭文件用fclose函数来实现。fclose函数的使用格 式为 fclose(文件指针); 其中,文件指针指向要关闭的文件。当文件正常 关闭时,函数返回0,否则返
14、回EOF。例如: fclose(fp); 第第12章章 文件操作文件操作 12.4 常用文件操作函数常用文件操作函数 文件打开后,就可以对该文件进行读写操作了。下 面介绍几个常用的文件操作函数。 12.4.1 文件的输入输出 1. 字符方式读写文件(fgetc函数和fputc函数) 1) fgetc函数的使用格式 fgetc函数的使用格式为 ch=fgetc(fp) ; 其中,fp为文件指针变量,ch为字符变量。fgetc函数 返回一个读取的字符,当返回EOF时表示文件结束或出 错,EOF的值为-1。 第第12章章 文件操作文件操作 对于fgetc函数的几点说明: (1) 在fgetc函数调用
15、中,读取的文件必须是以读或读 写方式打开的。 (2) 一般情况下,要将读取的字符赋给一个字符变量, 读取字符的结果也可以不向字符变量赋值,例如, “fgetc(fp);”,但是读出的字符不能保存。 (3) 在文件内部有一个位置指针,用来指向文件的当 前读写字节。在文件打开时,该指针总是指向文件的第一 个字节。使用fgetc函数后,该位置指针将向后移动一个字 节。因此可连续多次使用fgetc函数,读取多个字符。应注 意文件指针和文件内部的位置指针不是一回事。 第第12章章 文件操作文件操作 文件指针是指向整个文件的,须在程序中定义说 明,只要不重新赋值,文件指针的值是不变的。文件 内部的位置指针
16、用以指示文件内部的当前读写位置, 每读写一次,该指针均向后移动,它不需在程序中定 义说明,而是由系统自动设置的。 (4) 在读取二进制文件时,当读取到数据-1时,可 能会误解为文件结束,C语言提供了feof函数用于检测 文件是否结束。文件结束时,函数返回1,否则返回0。 第第12章章 文件操作文件操作 2) fputc函数的使用格式 fputc函数的使用方法为 fputc(ch , fp) ; 其中,ch为字符变量,fp为文件指针变量。fputc函 数将ch的值输出到fp所指的文件中,并返回该字符, 如果输出失败则返回EOF。 第第12章章 文件操作文件操作 对于fputc函数的几点说明: (
17、1) 被写入的文件可以用写、读写或追加方式打开。用 写或读写方式打开一个已存在的文件时,系统将清除原有 的文件内容,写入字符从文件首开始。如需保留原有文件 内容,希望写入的字符从文件末开始存放,则必须以追加 方式打开文件。被写入的文件若不存在,则必须创建该文 件。 (2) 每写入一个字符,文件内部位置指针向后移动一个 字节。 (3) fputc函数有一个返回值,如写入成功则返回写入的 字符,否则返回一个EOF。可用此来判断写入是否成功。 第第12章章 文件操作文件操作 【例12-1】从文本文件test中顺序读入文件内容,并 在屏幕上显示出来。 分析:定义一个文件指针,使用fopen函数以只读方
18、 式打开文件test,用fgetc函数从文件中读取字符,并将字 符显示在屏幕上。这里要注意如何判断何时到达文件的尾 部。 #include stdio.h void main( ) FILE *fp; /* 定义文件指针fp */ char ch; fp = fopen(test, r); /* 在当前目录下打开文件test,只读方式 */ if(fp=NULL) 第第12章章 文件操作文件操作 printf(can not open testn); exit(0); ch = fgetc(fp); /* 读取文件字符,直到文件结束 */ while(ch != EOF) putchar(ch
19、); 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=fopen(file2.c , w)=NULL) 第第12章章 文件操作文件操作 printf(cannot open the filen) ; exit(0) ; scanf(%s , str1) ; i=0 ; while(str
20、1i!=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(file3.c , a)=NULL) 第第12章章 文件操作文件操作 printf(cannot open the file ) ; exit(0) ; scanf(%s , str1) ; i=0 ; while(st
21、r1i!=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; printf(Enter the infile namen); /* 提示输入被复制文件的文件名 */ scanf(%s, infile); printf(Enter the outfile namen); /*
22、 提示输入复制文件的文件名 */ 第第12章章 文件操作文件操作 scanf(%s, outfile); if (in = fopen(infile, r)=NULL) /* 以只读方式打开被复制文件 */ printf(can not open infile %sn, infile); exit(0); /* 如果文件不能打开,退出程序 */ if(out = fopen(outfile, w)=NULL) /* 以写方式打开复制文件 */ printf(can not open outfile %sn, outfile); exit(0); 第第12章章 文件操作文件操作 while(!f
23、eof(in) fputc(fgetc(in), out); /* 将文件内容复制,直到文件结束 */ fclose(in); fclose(out); /* 关闭文件 */ 【例12-5】把命令行所指出的文件连起来输出到文 件connect.c中。 #include main(argc , argv) int argc ; char *argv ; 第第12章章 文件操作文件操作 FILE *sour1 , *sour2 , *dest ; char ch ; if(argc3) printf(notice:you should enter more filename!n) ; exit(0
24、) ; 第第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=fopen(connect.c , w)=NULL) printf(cannot open destinationfile!n) ; exit(0) ; while(!feof(sour1) fput
25、c(fgetc(sour1) , dest) ; while(!feof(sour2) fputc(fgetc(sour2) , dest) ; fclose(sour1) ; fclose(sour2) ; fclose(dest) ; 第第12章章 文件操作文件操作 【例12-6】检查命令行所列出的文件中每一行的左 括号“(”及右括号“)”是否匹配,如有错误,将错误所 在行数写入文件result中。 #include main(argc , argv) int argc ; char *argv ; FILE *sour , *dest ; int i , j , line , sign
26、, 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. 字符串方式读写文件(fgets函数和fputs函数) 1) fgets函数的使用格式 fgets函数的使用格式为 fgets(str,n,fp); 其中,str是字符数组名或字符指针,n
27、是一个正整数,fp 是文件指针。读字符串函数fgets函数的功能是从fp所指的文件 中读出n-1个字符送入字符数组str中。 对fgets函数的两点说明: (1) 在读出n-1个字符之前,如遇到了换行符或EOF,则 读出结束。 (2) fgets函数也有返回值,其返回值是字符数组的首地 址。 第第12章章 文件操作文件操作 【例12-7】从test文件中读入一个含10个字符的字符串。 分析:从test文件中读取10个字符,可以使用fgetc函数,也 可以使用fgets函数一次将10个字符读入内存,这里要注意 应该读取11个字符,最后一个字符是字符串结束标志。 #include main( )
28、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个字符赋予str,并将“0”放在数组的最 后元素中 */ printf(%s,str); fclose(fp); 第第12章章 文件操作文件操作 本例定义了一个字符
29、数组str共11个字节,在以读文本 文件方式打开文件test后,从中读出10个字符送入str数组, 在数组最后一个单元内将加上0,然后在屏幕上显示输出 str数组。 2) fputs函数的使用格式 fputs函数的使用格式为 fputs(str,fp); 其中,str为字符串或是字符数组,fp为文件指针。函 数fputs的功能是将字符串或字符数组复制到fp指向的文件 中。 第第12章章 文件操作文件操作 【例12-8】将输入的字符串添加到test文件的尾部。 分析:因为要将字符串添加到文件的尾部,所以 文件test的打开方式应是“a+”,对于本例还要注意, 输出文件的内容前须将文件指针指向文件
30、的开始位置。 #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); /* 输入字符串 */ fputs(st,fp); /* 将字符串追加到文件的尾部 */ rewind(fp); /* 使
31、文件指针回到文件的头部 */ 第第12章章 文件操作文件操作 ch=fgetc(fp); while(ch!=EOF) putchar(ch); /* 输出新产生的文件 */ ch=fgetc(fp); printf(n); fclose(fp); 第第12章章 文件操作文件操作 3. 二进制文件的输入与输出(fread函数和fwrite函数) 如果文件用二进制形式打开,则使用fread函数和 fwrite函数可以一次读入或写入多组数据(例如一个结构 体变量的值或一实数)。 1) fread函数的调用 读数据块函数调用的一般形式为 fread(buffer,size,count,fp); 2)
32、 fwrite函数的调用 写数据块函数调用的一般形式为 fwrite(buffer,size,count,fp); 第第12章章 文件操作文件操作 其中,buffer是一个指针,在fread函数中,它表示 存放输入数据的首地址;在fwrite函数中,它表示存放 输出数据的首地址。size表示数据块的字节数,count表 示要读写的数据块块数,fp表示文件指针。例如: fread(bf,4,5,fp); 其含义是从fp所指的文件中,每次读4个字节(一个 实数)送入bf指向的内存中,连续读5次,即读5个实数到 bf指向的内存中。 第第12章章 文件操作文件操作 【例12-9】从键盘输入两个学生数据
33、(姓名、学号、年龄 和家庭住址),将数据写入一个文件中,再读出这两个学生的 数据,并显示在屏幕上。 分析:向文件写入数据时使用fwrite函数,从文件中读取 数据时使用fread函数。 #include stdio.h struct stu char name10; int num; int age; char addr20; student12,student22,*pb1,*pb2; /*定义结构体数组student1和student2,用来存放学生 的数据*/ 第第12章章 文件操作文件操作 main( ) FILE *fp; /* 定义文件指针fp */ char ch; int i;
34、 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=student1; /* 指针重新指向student1 */ fwrite(pb1,sizeof(struct stu),2,f
35、p); /* 将学生的数据存入文件中 */ 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,并定义了两 个结构体数组student1和student2以及两个结构指针变量 pb1和pb2。pb1指向student1,pb2指向st
36、udent2。程序以 读写方式打开二进制文件“stu_data”,输入两个学生数 据之后,写入该文件中,然后把文件内部位置指针移 到文件首,读出两个学生数据后,在屏幕上显示。 第第12章章 文件操作文件操作 【例12-10】定义一个包含学生信息的结构体变量, 其中有学号、姓名、年龄和班级等几个域,每次利用 fread函数从文件中读入一个记录,当年龄小于20岁时 打印出来。 #include struct studentint number ; char name10 ; int age ; char class10 ; ; 第第12章章 文件操作文件操作 main( ) FILE *fp ;
37、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( if(s.age20) printf(%d %s %d %sn , s.number , , s.age , s.class) ; fclose(fp) ; 第第12章章 文件操作文件操作 【例12-11】某公司新进一批电脑,文件comre
38、c中 存储了这批电脑的信息,设文件有如下记录: type:01price:7999 number:30 type:02price:8999 number:20 type:03price:11000 number:10 type:04price:16000 number:5 请将price number进行累加。 #include struct computer char type10 ; double price ; int number ; ; 第第12章章 文件操作文件操作 main( ) FILE *fp ; struct computer c ; int size ; double s
39、um ; sum=0 ; size=sizeof(struct computer) ; if(fp=fopen(comrec , rb)=NULL) 第第12章章 文件操作文件操作 printf(cannot open the file!) ; exit(0) ; while(!feof(fp) fread( sum+=c.price*c.number ; /* 计算总价 */ printf(the sum is:%f , sum) ; fclose(fp) ; 第第12章章 文件操作文件操作 4. 文件格式化的输入与输出(fscanf函数和fprintf函数) fscanf函数和fprint
40、f函数与前面使用的scanf和printf函数 的功能相似,都是格式化读写函数。两者的区别在于fscanf 函数和fprintf函数的读写对象不是键盘和显示器,而是磁盘 文件。 1) fscanf函数的调用 fscanf函数的调用格式为 fscanf(文件指针,格式字符串,输入表列); 2) fprintf函数的调用 fprintf函数的调用格式为 printf(文件指针,格式字符串,输出表列); 第第12章章 文件操作文件操作 例如: fscanf(fp,%d%s, /* 从fp指向的文件中读取的数据分别放在i和s指向 的内存中 */ fprintf(fp,%d%c,j,ch); /* 将j
41、和ch中的数据存入fp指向的文件中 */ 第第12章章 文件操作文件操作 【例12-12】从键盘输入两个学生数据(姓名、学号、 年龄和家庭住址),将数组写入一个文件中,再读出这 两个学生的数据,并显示在屏幕上。 #include stdio.h main( ) FILE *fp; int i; struct stu /* 定义结构体类型 */ char name15; char num6; float score2; student; /* 说明结构体变量student */ 第第12章章 文件操作文件操作 if(fp=fopen(test1.txt,w)=NULL) /* 以文本只写方式打开
42、文件 */ printf(cannot open file); exit(0); printf(input data:n); for( i=0;i2;i+) scanf(%s %s %f %f,,student.num, 第第12章章 文件操作文件操作 /* 从键盘输入 */ f p r i n t f ( f p , % s % s % 7 . 2 f %7.2fn,,student.num,student.score0,stude nt.score1); /* 写入文件 */ fclose(fp); /* 关闭文件 */ if(fp=fope
43、n(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, /* 显示到屏幕 */ fclose(fp); /* 关闭文件 */ 第第12章章 文件操作文件操作 【例12-13】在学生文件中存有如下信息,包括学号、 课程和成绩。调出这些学生信息,将成绩不及格(60分)的 学号输出到文件stu1中。 # includ
44、e struct student int number ; char cname10 ; int scorce ; ; 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
45、) ; 第第12章章 文件操作文件操作 while(!feof(fp) fread( if(s.scorce60) printf(fp1 , %d %s %dn , s.number , ame , s.scorce) ; fclose(fp) ; 第第12章章 文件操作文件操作 5. 随机读写函数(rewind函数和fseek函数) 前面介绍的对文件的读写方式都是顺序读写,即读写文 件只能从头开始,顺序读写各个数据。但在实际问题中常要 求只读写文件中某一指定的部分。为了解决这个问题,可移 动文件内部的位置指针到需要读写的位置,再进行读写,这 种读写称为随机读写。实现随机读写的关键是要按要求移
46、动 位置指针,这称为文件的定位。文件定位移动文件内部位置 指针的函数主要有两个,即rewind函数和fseek函数。 第第12章章 文件操作文件操作 1) rewind函数的调用 rewind函数的功能是把文件内部的位置指针移到文件首。 它的调用格式是 rewind(文件指针); 2) fseek函数的调用 fseek函数用来移动文件内部位置指针,其调用格式是 fseek(文件指针,位移量,起始点); 其中,“文件指针”指向被移动的文件。“位移量”表 示移动的字节数,要求位移量是long型数据,以便在文件长 度大于64 KB时不会出错。当用常量表示位移量时,要求加 后缀“L”。“起始点”表示从
47、何处开始计算位移量,规定 的起始点有3种:文件首,当前位置和文件尾。其表示方法 见表12-2。 第第12章章 文件操作文件操作 表12-2 文 件 指 针 打开方式 含 义 说 明 r 只读 为输入打开一个已存在的文本文件 w 只写 为输出打开一个文本文件 a 追加 为追加打开一个已存在的文本文件 rb 只读 为输入打开一个已存在的二进制文件 wb 只写 为输出打开一个二进制文件 ab 追加 为追加打开一个已存在的二进制文件 r+ 读写 为既读又写打开一个已存在的文本文件 w+ 读写 为既读又写新建一个文本文件 a+ 读写 为既读又写打开一个已存在的文本文件,文件指针移至文件末尾 rb+ 读写
48、 为既读又写打开一个已存在的二进制文件 wb+ 读写 为既读又写新建一个二进制文件 ab+ 读写 为既读又写打开一个已存在的二进制文件,文件指针移至文件末尾 第第12章章 文件操作文件操作 例如: fseek(fp,200L,0); 其含义是把位置指针移到离文件首200个字节处。还 要说明的是,fseek函数一般用于二进制文件。在文本文件 中由于要进行转换,故往往计算的位置会出现错误。文件 的随机读写在移动位置指针之后,即可用前面介绍的任一 种读写函数进行读写。由于一般是读写一个数据块,因此 常用fread和fwrite函数。 第第12章章 文件操作文件操作 【例12-14】 写入3个学生记录
49、,记录内容为学生 姓名、学号和两科成绩。写入成功后,随机读取第3条 记录,并用第2条记录替换。 分析:使用结构体stu数据student存放3个学生的基 本情况,使用fwrite函数将学生的基本情况存入文件 “test.txt”中,使用fseek函数定位第3条记录,并用第2 条记录替换它。 第第12章章 文件操作文件操作 #include stdio.h #include stdlib.h struct stu char name10; char num6; float score2; ; 第第12章章 文件操作文件操作 main( ) FILE *fp1; /* 定义文件指针 */ char
50、 *temp; int i,j; StructStustudent3=wang,1001,60,61,zhang, 1002,70,71,li,1003,80,81; if(fp1=fopen(test.txt,wb)=NULL) /* 以二进制只写方式打开文件 */ printf(cannot open file); exit(0); 第第12章章 文件操作文件操作 for(i=0;i3;i+) fwrite( /* 成块写入 */ fclose(fp1); /* 关闭 */ if(fp1=fopen(test.txt,rb+)=NULL) /* 以可读写方式打开文件 */ printf(c
51、annot open file); exit(0); printf(-n); p r i n t f ( % - 1 5 s % - 7 s % - 7 s % - 7sn,name,num,score1,score2); printf(-n); 第第12章章 文件操作文件操作 for(i=0;i3;i+) /* 显示全部文件内容 */ fread( printf(%-15s%- 7s%7.2f%7.2fn,,studenti.num,studen ti.score0, studenti.score1); 第第12章章 文件操作文件操作 /* 以下进行文件的随机读写
52、*/ fseek(fp1,2*sizeof(struct stu),0); /* 定位文件指针指向第3条记录 */ fwrite( /* 在第三条记录处写入第二条记录 */ 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( printf(%-15s%- 7s%7.2f%7.2fn,stu
53、,studenti.num,student i.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 i , j ; if(argc3) 第第12章章 文件操作文件操作 printf(notice : you
54、 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 ; j+) fputc(fgetc(sour) , dest) ; 第第12章章 文件操作文件操作 r
55、ewind(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 ; struct student s ; int i , size ; size=sizeo
56、f(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 , printf(name:) ; scanf(%s , printf(age:) ; 第第12章章 文件操作文件操作 scanf(%d , printf(class:) ; scanf(%s , fwrite( fclose(fp) ; 第第12章章 文件操作文件操作 【例12-17】向一个有序文件(从小到大的顺序)中插 入一条记录。 #include struct st
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025中建八局土木公司即中国建筑土木建设有限公司招聘443人笔试历年参考题库附带答案详解
- 2025三峡绿色发展有限公司招聘29人笔试历年参考题库附带答案详解
- (英语)高二英语完形填空夹叙夹议题20套(带答案)及解析
- 2025法律职业资格(主观题)试题解析+答案
- 2025年保安员资格冲刺押题试卷含答案解析
- 2026年福建生物工程职业技术学院高职单招职业适应性考试备考题库及答案详解
- 2026年德宏职业学院单招职业技能笔试备考试题及答案详解
- 2026年江苏护理职业学院高职单招职业适应性测试备考试题及答案详解
- 2026年湖南科技职业学院高职单招职业适应性考试模拟试题及答案详解
- 2026年福州外语外贸学院高职单招职业适应性考试备考试题及答案详解
- GB/T 8642-2025热喷涂抗拉结合强度的测定
- 贵州省贵阳市2024-2025学年高一上学期期末监测物理试卷(含解析)
- 平昌县2025年下半年公开考调公务员(参照管理工作人员)备考题库附答案
- 2025年华中科技大学职工队伍公开招聘备考题库附答案详解
- 2025年全国自考管理学原理真题及答案
- 期末冲刺备考总动员校长在教师会议上讲话:五字诀精实盯严稳
- 2025年度急诊科护士长述职报告
- 2026年郑州电力高等专科学校单招职业技能考试模拟测试卷附答案解析
- 湖北省武汉市洪山区2024-2025学年五年级上学期期末数学试卷
- 装修工程施工方案简单版
- 七年级历史下册期末模拟试卷题库试题附答案完整版
评论
0/150
提交评论