第十三章文件 学习目的与要求:1.理解文件的概念和FLE类型 2.重点掌握文件的打开、文件的打开方式、文件的关闭 3.了解文件的读和写函数的使用格式 重点 1.重点掌握文件的打开、文件的打开方式、文件的关闭 2.了解文件的读和写函数的使用格式。 知识归纳 1.C文件概述 (1)文件:是指存储在外部介质上数据的集合。 (2)根据数据的组织形式,C中将文件分为:ASCI文件和二进制文件 ASCI文件又称为文本文件,它的每一个字节放一个ASCI代码,代表一个字符 进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。所以,一个 C文件是一个字节流或二进制流。 (3)什么叫“缓冲文件系统”?缓冲文件系统是指系统自动的在内存区为每一个正在 使用的文件名开辟一个缓冲区。从内存向磁盘输出数据必须先送到内存中的缓冲区,装满 缓冲区后才一起送到磁盘去;如果从磁盘向内存读入数据,则从磁盘文件将一批数据输入 到内存缓冲区,然后再从缓冲区逐个的将数据送到程序数据取。 2.文件的打开与关闭 (1)FLE类型:FLE是系统定义好的,一个结构体类型名,该结构体类型的变量可以 存放文件的有关信息,如文件名、文件状态、文件当前位置等。 (2)文件的打开 先定义FIE类型的文件指针 再使用 fopen函数打开文件 FILE *fp fp= fopen(“文件名”打开文件的方式”) ∥将以某种方式打开的文件地址存入印文件指针中 如:FLE*f fp= fopen(“flel””r”) (3)文件的打开方式
第十三章 文 件 学习目的与要求:1. 理解文件的概念和 FILE 类型。 2. 重点掌握文件的打开、文件的打开方式、文件的关闭。 3. 了解文件的读和写函数的使用格式。 重点: 1. 重点掌握文件的打开、文件的打开方式、文件的关闭。 2. 了解文件的读和写函数的使用格式。 知识归纳 1. C 文件概述 (1) 文件:是指存储在外部介质上数据的集合。 (2) 根据数据的组织形式,C 中将文件分为:ASCII 文件和二进制文件。 ASCII 文件又称为文本文件,它的每一个字节放一个 ASCII 代码,代表一个字符;二 进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。所以,一个 C 文件是一个字节流或二进制流。 (3) 什么叫“缓冲文件系统”?缓冲文件系统是指系统自动的在内存区为每一个正在 使用的文件名开辟一个缓冲区。从内存向磁盘输出数据必须先送到内存中的缓冲区,装满 缓冲区后才一起送到磁盘去;如果从磁盘向内存读入数据,则从磁盘文件将一批数据输入 到内存缓冲区,然后再从缓冲区逐个的将数据送到程序数据取。 2. 文件的打开与关闭 (1) FILE 类型 :FILE 是系统定义好的,一个结构体类型名,该结构体类型的变量可以 存放文件的有关信息,如文件名、文件状态、文件当前位置等。 (2) 文件的打开: 先定义 FILE 类型的文件指针 ; 再使用 fopen()函数打开文件 FILE * fp ; fp= fopen(“文件名”,”打开文件的方式 ”); //将以某种方式打开的文件地址存入 fp 文件指针中; 如:FILE * fp ; fp = fopen( “file1”,” r ”) ; (3) 文件的打开方式:
第二部分¢语言程序设计同步训练 文件打开方式 适用文件类型 文本文件 rb(只读),wb(只写),ab(追加) 进制文件 文本文件 (4)文件的关闭 件使用完后,要求关闭,以防止再被误用。 文件关闭函数: fclose(文件指针) fp); 3.文件的读写函数 函数格式 作用 putto 把一个字符写到文件指针所指向的磁盘文件中 fetch ch=fgetc(fp); 从文件指针所指向的文件中读入一个字符,赋 给字符变量ch fread fread(buffer size, count, fp); 从印指针所指向的文件中读入size字节,读 cm次t,读入数据存入 buffer E的地址中 forteo fwrite(buffer,ie, count, fp);|将bufe地址存放的数据,写入印指针所指向 的文件中,每次写size字节,写 count次 将tk变量中的值按指定格式,写 ascanio semp,%d,%f“,&t,&k);从印所指向的文件中,按指定格式,读入数据, 从文件指针所指向的文件中读入一个字符串 fputs( str, fp) 把一个字符串写到文件指针所指向的磁盘文件 中去 基础训练(A) 填空题 1.文件是指 2.根据数据的组织形式,C中将文件分为 和 两种类型 3.现要求以读写方式,打开一个文本文件stul,写出语句: 4.现要求将上题中打开的文件关闭掉,写出语句
第二部分 C 语言程序设计同步训练 ·279· ·279· 文件打开方式 适用文件类型 r (只读), w(只写) , a(追加) 文本文件 rb(只读), wb(只写) , ab(追加) 二进制文件 r+ (读写), w+(读写) , a+(读写) 文本文件 rb+ (读写), wb+(读写) , ab+(读写) 二进制文件 (4) 文件的关闭: 文件使用完后,要求关闭,以防止再被误用。 文件关闭函数:fclose(文件指针) 如 fclose ( fp); 3. 文件的读写函数 函数 函数格式 作用 fputc() fputc(ch , fp); 把一个字符写到文件指针所指向的磁盘文件中 去; fgetc() ch=fgetc(fp); 从文件指针所指向的文件中读入一个字符,赋 给字符变量 ch; fread() fread(buffer ,size ,count ,fp); 从 fp 指针所指向的文件中读入 size 字节,读 count 次,读入数据存入 buffer 的地址中; fwrite() fwrite(buffer , size , count ,fp) ; 将 buffer 地址存放的数据,写入 fp 指针所指向 的文件中,每次写 size 字节,写 count 次; fprintf() fprintf(fp ,”%d,%f” , t , k ); 将 t,k 变量中的值按指定格式,写入 fp 指针所指 向的文件中; fscanf() fScanf(fp ,”%d ,%f “ , &t ,& k) ; 从 fp 所指向的文件中,按指定格式,读入数据, 存入 t,k 变量中 fgets() fgets(str , n ,fp); 从文件指针所指向的文件中读入一个字符串; fputs() fputs( str , fp) ; 把一个字符串写到文件指针所指向的磁盘文件 中去; 基础训练(A) 一、填空题 1. 文件是指___________________________________________________________。 2. 根据数据的组织形式,C 中将文件分为______________和______________两种类型。 3. 现要求以读写方式,打开一个文本文件 stu1 ,写出语句: ____________________。 __________________________________。 4. 现要求将上题中打开的文件关闭掉,写出语句:_____________________
C语言程序设计上机指导与同步训练 5.若要用 fopen函数打开一个新的二进制文件,该文件要既能读也能写,则打开文件 方式字符串应该是 6.已知函数的调用形式: fread( buffer size, count,fp);其中buer代表的是 7. fwrite函数的一般调用形式是 选择题 1.当已经存在一个 file l.txt文件,执行函数 fopen( "file.txt”;"r+”)的功能是()。 A)打开 file l. txt文件,清除原有的内容; B)打开 file l. txt文件,只能写入新的内容 C)打开 file l.txt文件,只能读取原有内容 D)打开 file l. txt文件,可以读取和写入新的内容 2.fead(buf,642.)的功能是:() A)从印所指向的文件中,读出整数64,并存放在buf中 B)从印所指向的文件中,读出整数64和2,并存放在buf中 C)从印所指向的文件中,读出64个字节的字符,读两次,并存放在buf地址中; D)从印所指向的文件中,读出64个字节的字符,并存放在buf中 3.以下程序的功能是()。 main() FILE f char str[]="Beijing 2008" Ep fopen("file2","w") fputs(str, fp) fclose(fp) A)在屏幕上显示“ Beiing2008”: B)把” Beijing2008”存入fle2文件中 C)在打印机上打印出“ Beiing2008 D)以上都不对; 4.以下程序是建立一个名为 myfile的文件,并把从键盘输入字符存入该文件,当键盘 上输入结束时关闭该文件。选择正确内容填空。 main() I FILE *fp char ci char fname [10] ("myfile" I c=getchar() fputc y while(c!=EOF Eclose(fp) (1)A)fgets
·280· C 语言程序设计上机指导与同步训练 ·280· 5. 若要用 fopen 函数打开一个新的二进制文件,该文件要既能读也能写,则打开文件 方式字符串应该是_____________。 6. 已知函数的调用形式:fread(buffer ,size , count , fp) ; 其中 buffer 代表的是 ______________________________。 7. fwrite 函数的一般调用形式是_______________________________________。 二、选择题 1. 当已经存在一个 file1.txt 文件,执行函数 fopen(“file1.txt”,”r+”)的功能是( )。 A) 打开 file1.txt 文件,清除原有的内容; B) 打开 file1.txt 文件,只能写入新的内容; C) 打开 file1.txt 文件,只能读取原有内容; D) 打开 file1.txt 文件,可以读取和写入新的内容; 2. fread(buf , 64,2,fp)的功能是:( )。 A) 从 fp 所指向的文件中,读出整数 64,并存放在 buf 中; B) 从 fp 所指向的文件中,读出整数 64 和 2,并存放在 buf 中; C) 从 fp 所指向的文件中,读出 64 个字节的字符,读两次,并存放在 buf 地址中; D) 从 fp 所指向的文件中,读出 64 个字节的字符,并存放在 buf 中; 3. 以下程序的功能是( ) 。 main() { FILE * fp; char str[]=”Beijing 2008”; fp = fopen(“file2”,”w”); fputs(str,fp); fclose(fp); } A) 在屏幕上显示“Beiing 2008”; B) 把”Beijing 2008”存入 file2 文件中; C) 在打印机上打印出“Beiing 2008”; D) 以上都不对; 4. 以下程序是建立一个名为 myfile 的文件,并把从键盘输入字符存入该文件,当键盘 上输入结束时关闭该文件。选择正确内容填空。 main() { FILE *fp; char c ; char fname[10]; fp=____________(“myfile”,________); do { c=getchar(); fputc(c , fp); } while(c!=EOF); fclose(fp); } (1) A) fgets B) fopen C) fclose D) fgetc
第二部分¢语言程序设计同步训练 81 (2)A)“r C)w” 三、设计题 编写一个程序,以只读方式打开一个文本文件 filea. txt,如果打开,将文件地址放在f 文件指针中,打不开,显示“Can' t open filea. txt file n.”,然后退出 能力提高(B) 、填空题 1.下面程序由键盘输入字符,存放到文件中,用!结束输入,请在 上填空。 #include void main() FILE★f char fname [10] printf("Input name of file\n") gets(fname) if ((fp=fopen( fname, "W"))==NULL) printf ("cannot open file\n"); exit(o) printf(("Enter data: \n") hile( //提示:从键盘输入一个字符,如不是 //将从键盘输入的字符存入打开的文件中 fclose(fp) 2.下面程序用变量 count统计文件中字符的个数。请在 中填写正确内容 #include vood main( I FILE *fp long count =0; if ((fp=fopen ("letter. txt" printf ("cannot open file\n") while( feof (fp)) // feof (fp) 未到文件尾,为真 /feof()函数判断文件指针是否到文件尾,到文件尾,函数返回非0值,若未到文件尾,函数 返回值0 //提示:从文件读入一个字符 printf( "count =gld\n", count)i
第二部分 C 语言程序设计同步训练 ·281· ·281· (2) A) “r” B) “r+” C) “w” D) “w+” 三、设计题 编写一个程序,以只读方式打开一个文本文件 filea.txt ,如果打开,将文件地址放在 fp 文件指针中,打不开,显示“Cann’t open filea.txt file \n.”,然后退出。 能力提高(B) 一、填空题 1. 下面程序由键盘输入字符,存放到文件中,用!结束输入,请在____________上填空。 #include void main() { FILE *fp; char ch ; char fname[10]; printf(“Input name of file\n”); gets(fname); if ((fp=fopen( fname, “w”))==NULL) { printf (“cannot open file\n”); exit(0) ; } printf((“Enter data:\n”); while(_______________!=’!’) //提示:从键盘输入一个字符,如不是! fputc(__________________) ; //将从键盘输入的字符存入打开的文件中 fclose(fp); } 2. 下面程序用变量 count 统计文件中字符的个数。请在____________中填写正确内容。 #include vood main() { FILE *fp; long count =0; if ((fp=fopen(“letter.txt”,___________))==NULL) { printf (“cannot open file\n”); exit(0) ; } while( ! feof (fp)) //! feof (fp)---- 未到文件尾,为真 //feof()函数判断文件指针是否到文件尾,到文件尾,函数返回非 0 值,若未到文件尾,函数 返回值 0 { ___________________; //提示:从文件读入一个字符 ______________; } printf( “count =%ld\n”,count); _________________; }
C语言程序设计上机指导与同步训练 二、选择题 1.若有以下定义和说明 struct std I char num [6] ame [81 }a30 F工LE★ 设文件中以二进制形式存有许多学生的数据,且已经正确打开,文件指针定位在文件 开头,若要从文件中读出30个学生的数据放入a数组中,以下正确的语句是( d),30,fp) B)fread(&a[i, sizeof(struct std), I, fp) C)fread(a +i, sizeof(struct std), 1, fp) D)fread(a, struct std, 30, fp) 2.设有以下结构体类型 struct st I char name [8]; float s[4] 并且结构体数组 student中的元素都已经有值,若要将这些元素写到印所指向的磁盘 文件中,以下不正确的形式是 A)fwrite(student, sizeof(struct st ) 20, fp) B)fwrite(student 20* sizeof(struct st), 1, fp): C)fwrite(student, 10*sizeof(struct st ) 10, fp) D)for(i=0;<20;i++) fwrite(student+i, sizeof(struct st ), 1, fp) 3.以下程序是将一个名为 old. dat的文本文件拷贝到一个名为 new. dat的新文本文件 中,请选择正确内容填空 #include <stdio. h void main() [ FILE fpl, *fp2 i Epl=fopen("old. dat" fp2=fopen("new. dat", C=getc(fpl while(cl=EOF) i fputc(c, fp2) fclose(fy
·282· C 语言程序设计上机指导与同步训练 ·282· 二、选择题 1. 若有以下定义和说明: #include struct std { char num[6]; char name[8]; float mark[4]; }a[30]; FILE * fp; 设文件中以二进制形式存有许多学生的数据,且已经正确打开,文件指针定位在文件 开头,若要从文件中读出 30 个学生的数据放入 a 数组中,以下正确的语句是( )。 A) fread (a , sizeof(struct std),30 , fp) ; B) fread (&a[i] , sizeof(struct std),1 , fp) ; C) fread (a +i, sizeof(struct std),1 , fp) ; D) fread (a , struct std,30 , fp) ; 2. 设有以下结构体类型: struct st { char name[8]; int num; float s[4]; } student [20]; 并且结构体数组 student 中的元素都已经有值,若要将这些元素写到 fp 所指向的磁盘 文件中,以下不正确的形式是( )。 A) fwrite (student , sizeof(struct st ),20 , fp) ; B) fwrite (student ,20* sizeof(struct st ),1, fp) ; C) fwrite (student , 10*sizeof(struct st ),10 , fp); D) for (i=0;i void main() { FILE * fp1, *fp2 ; int c ; fp1=fopen(“old.dat”,__________); fp2=fopen(“new.dat”,__________); c=getc(fp1); while(c!=EOF) { fputc(c,fp2) ; c = fgetc(fp1); } fclose(fp1); fclose(fp2);
第二部分¢语言程序设计同步训练 283· A) A)"W+ 三、问答题 1.什么叫“缓冲文件系统”? 四、编程题 1.从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,然后输出到一个 磁盘文件“test”中保存,输入的字符串以!表示结束。 链接二级考试 、选择题 1.若要打开A盘上user子目录下名为 abc txt的文本文件进行读、写操作,下面符合 此要求的函数调用是()。 A)fopen("A: \userlabc txt", " I") B)fopen("A: userllabc txt"," r+") C)fopen("A: user\abc. txt", rb") C) fopen("A: userllabc txt", w) (2002年4月) 2.若印已正确定义并指向某个文件,当未遇到该文件结束标志时函数feof印p)的值为 )一个非0值 (2003年9月) 3.下面的程序执行后,文件 testtt FE内容是()。 #include void fun(char *fname, char *st) I FILE *myf; int i myf=fopen(fname, "w")i for(i=0;i main() fp=fopen("dl. dat""w"): fprintf(fp,"d\n”,i); fprintf(fp,“皆d\n”j) cI fp=fscanf(fp, "bdsd,&k, &n) printf("gasd\n",k, n)i
第二部分 C 语言程序设计同步训练 ·283· ·283· } A) “r” B ) “r+” C) “rb” D) “rb+” A) “W+ “ B) “wb+” C) “ w” D) “wb” 三、问答题 1. 什么叫“缓冲文件系统”? 四、编程题 1. 从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,然后输出到一个 磁盘文件“test ”中保存,输入的字符串以!表示结束。 链接二级考试 一、选择题 1. 若要打开 A 盘上 user 子目录下名为 abc.txt 的文本文件进行读、写操作,下面符合 此要求的函数调用是( )。 A) fopen("A:\user\abc.txt","r") B) fopen("A:\\user\\abc.txt","r+") C) fopen("A:\user\abc.txt","rb") C) fopen("A:\\user\\abc.txt","w") (2002 年 4 月) 2. 若 fp 已正确定义并指向某个文件,当未遇到该文件结束标志时函数 feof(fp)的值为 ( )。 A) 0 B) 1 C) -1 D) 一个非 0 值 (2003 年 9 月) 3. 下面的程序执行后,文件 testt.t 中的内容是( )。 #include void fun(char *fname.,char *st) { FILE *myf; int i; myf=fopen(fname,“w” ); for(i=0;i main() { FILE *fp; int i=20,j=30,k,n; fp=fopen(“d1.dat”“w”); fprintf(fp,“%d\n”,i);fprintf(fp,“%d\n”j); fclose(fp); fp=fopen(“d1.dat”, “r”); fp=fscanf(fp,“%d%d”,&k,&n); printf(“%d%d\n”,k,n);
C语言程序设计上机指导与同步训练 fclose(fp) 程序运行后的输出结果是() A)2030 D)3020 (2002年9) 、填空题 1.以下程序段打开文件后,先利用 fseek函数将文件位置指针定位在文件末尾,然后 调用ftl函数返回当前文件位置指针的具体位置,从而确定文件长度,请填空。 FILE *myf i ling ("test.t”,"xb") seek(myf, 0, SEEK END); fl=ftel(myf) fclose(myf) printf(”dln”,f1) (2001年9月) 2.下面程序把从终端读入的10个整数以二进制方式写到一个名为 bi. dat的新文件中 请填空 #include F工LE main() int i if((fp=fopen( "wb"))==NULL) exit(o) scanf("器a",&j); fwrite(&3, sizeof (int),1 fclose(fp) (1999年4月) 3.以下程序用来统计文件中字符个数,请填空。 FILE *fp long num=OL if((fp=fopen("fname. dat","r"))==NULL) I printf("Open error\n"); exit(0); I fgetc(fp); num++; printf("num=ld\n", num-1) (2002年4月 4.以下程序中用户由键盘输入一个文件名,然后输入一串字符(用#结束输入)存放到此 文件文件中形成文本文件,并将字符的个数写到文件尾部,请填空
·284· C 语言程序设计上机指导与同步训练 ·284· fclose(fp); } 程序运行后的输出结果是( )。 A) 20 30 B) 20 50 C) 30 50 D) 30 20 (2002 年 9) 二、填空题 1. 以下程序段打开文件后,先利用 fseek 函数将文件位置指针定位在文件末尾,然后 调用 ftell 函数返回当前文件位置指针的具体位置,从而确定文件长度,请填空。 FILE *myf; ling f1; myf= _________ (“test.t”,“rb”); fseek(myf,0,SEEK_END); f1=ftel(myf); fclose(myf); printf(“%d\n”,f1); (2001 年 9 月) 2. 下面程序把从终端读入的 10 个整数以二进制方式写到一个名为 bi.dat 的新文件中, 请填空。 #include FILE *fp; main() { int i,j; if((fp=fopen(____________, "wb"))==NULL) exit(0); for(i=0; i main() { FILE *fp; long num=0L; if((fp=fopen("fname.dat","r"))==NULL) { printf("Open error\n"); exit(0);} while( _________________ ) { fgetc(fp); num++;} printf("num=%1d\n",num-1); fclose(fp); } (2002 年 4 月) 4. 以下程序中用户由键盘输入一个文件名,然后输入一串字符(用#结束输入)存放到此 文件文件中形成文本文件,并将字符的个数写到文件尾部,请填空。 #include main( )
第二部分¢语言程序设计同步训练 285 FILE char ch, fname [32] int count=O printf ("Input the filename ") scanf ("&s", fname) if((fp=fopen ,"w+"))==NULL) I printf("Can't open file: s \n", fname): exit(0):1 printf("Enter data: \n"): while((ch=getchar())I="#") fputc(ch, fp): count++ fprintf( n\nsd\n' count) (1999年9月 5.以下程序的功能是:从键盘上输入一个字符串,把该字符串中的小写字母转换为大写 字母输出到文件 test. txt中,然后从该文件读出字符串并显示出来,请填空。 #include [FII char str [100]: int i=0 if((fp=fopen("text. txt" ))==NULL) I printf("can't open this file. \n"); exit(); printf("input astring: \n") gest(str) while (str[i]) I if(str[il>='a&&str[i]<='z') str[il= putc(str [i], fp) fclose(fp)i fp=fopen("test. txt" fgets(str, 100, fp) printf("8s\n", str)
第二部分 C 语言程序设计同步训练 ·285· ·285· { FILE *fp; char ch,fname[32]; int count=0; printf("Input the filename :"); scanf("%s",fname); if((fp=fopen( _____________ ,"w+"))==NULL) { printf("Can't open file:%s \n",fname); exit(0);} printf("Enter data:\n"); while((ch=getchar())!="#"){ fputc(ch,fp); count++;} fprintf(____________ ,"\n%d\n", count); fclose(fp); } (1999 年 9 月) 5. 以下程序的功能是:从键盘上输入一个字符串,把该字符串中的小写字母转换为大写 字母,输出到文件 test.txt 中,然后从该文件读出字符串并显示出来,请填空。 #include main() { FILE *fp; char str[100]; int i=0; if((fp=fopen("text.txt",___________))==NULL) { printf("can't open this file.\n");exit(0);} printf("input astring:\n"); gest(str); while (str[i]) { if(str[i]>='a'&&str[i]<='z') str[i]=_____ ________; fputc(str[i],fp); i++; } fclose(fp); fp=fopen("test.txt",______________); fgets(str,100,fp); printf("%s\n",str); fclose(fp); }