第十三章 文 件
学习目的与要求:1,理解文件的概念和FILE类型。
2,重点掌握文件的打开、文件的打开方式、文件的关闭。
3,了解文件的读和写函数的使用格式。
重点,1,重点掌握文件的打开、文件的打开方式、文件的关闭。
2,了解文件的读和写函数的使用格式。
知识归纳
1,C文件概述
(1) 文件:是指存储在外部介质上数据的集合。
(2) 根据数据的组织形式,C中将文件分为:ASCII文件和二进制文件。
ASCII文件又称为文本文件,它的每一个字节放一个ASCII代码,代表一个字符;二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。所以,一个
C文件是一个字节流或二进制流。
(3) 什么叫“缓冲文件系统”?缓冲文件系统是指系统自动的在内存区为每一个正在使用的文件名开辟一个缓冲区。从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去;如果从磁盘向内存读入数据,则从磁盘文件将一批数据输入到内存缓冲区,然后再从缓冲区逐个的将数据送到程序数据取。
2,文件的打开与关闭
(1) FILE类型,FILE是系统定义好的,一个结构体类型名,该结构体类型的变量可以存放文件的有关信息,如文件名、文件状态、文件当g2081g1313g13634g12573。
(2) 文件的g6183开,
先定义FILE类型的文件指g19036 ;
再使用 fopen()g2001数g6183开文件
FILE * fp ;
fp= fopen(“文件名”,”g6183开文件的g7053式,);
//将以g7588g12193g7053式g6183开的文件g3332g3348存入fp文件指g19036中;
如:FILE * fp ;
fp = fopen(,file1”,” r,) ;
(3) 文件的g6183开g7053式,
第二部分 C语言程序设计同步训练
·279·
·279·
文件打开方式 适用文件类型
r (只读),w(只写),a(追加) 文本文件
rb(只读),wb(只写),ab(追加) 二进制文件
r+ (读写),w+(读写),a+(读写) 文本文件
rb+ (读写),wb+(读写),ab+(读写) 二进制文件
(4) 文件的关g19393,
文件使用g4448后,g16213g8726关g19393,以g19462g8502再g15999g16835用。
文件关g19393g2001数:fclose(文件指g19036)
如 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)
一、g3647g12366g20076
1,文件是指___________________________________________________________。
2,根据数据的组织形式,C中将文件分为______________和______________g1016g12193类型。
3,g10628g16213g8726以读g1901g7053式,g6183开一个文本文件 stu1,g1901出g16833g2489,
____________________。
__________________________________。
4,g10628g16213g8726将上g20076中g6183开的文件关g19393g6493,g1901出g16833g2489:_____________________。
C语言程序设计上机指导与同步训练
·280·
·280·
5,g14521g16213用 fopeng2001数g6183开一个g7044的二进制文件,该文件g16213g7094g14033读g1075g14033g1901,则g6183开文件
g7053式字符g1030g5224该是_____________。
6,g5062g11705g2001数的g16855用形式:fread(buffer,size,count,fp) ; 其中 buffer 代表的是
______________________________。
7,fwriteg2001数的一g14336g16855用形式是_______________________________________。
二、g17885g6333g20076
1,当g5062g13475存在一个file1.txt文件,g6203g15904g2001数fopen(“file1.txt”,”r+”)的g2163g14033是( g3 )。
A) g6183开file1.txt文件,g9177g19512原有的内g4493;
B) g6183开file1.txt文件,g2494g14033g1901入g7044的内g4493;
C) g6183开file1.txt文件,g2494g14033读取原有内g4493;
D) g6183开file1.txt文件,可以读取和g1901入g7044的内g4493;
2,fread(buf,64,2,fp)的g2163g14033是:( )。
A) 从fp所指向的文件中,读出g6984数64,g5194存放在buf中;
B) 从fp所指向的文件中,读出g6984数64和2,g5194存放在buf中;
C) 从fp所指向的文件中,读出64个字节的字符,读g1016g8437,g5194存放在bufg3332g3348中;
D) 从fp所指向的文件中,读出64个字节的字符,g5194存放在buf中;
3,以g991程序的g2163g14033是( ) 。
main()
{
FILE * fp;
char str[]=”Beijing 2008”;
fp = fopen(“file2”,”w”);
fputs(str,fp);
fclose(fp);
}
A) 在g4643g5161上g7186g12046“Beiing 2008”;
B) 把”Beijing 2008”存入file2文件中;
C) 在g6183g2372g7438上g6183g2372出“Beiing 2008”;
D) 以上g18129g993g4557;
4,以g991程序是g5326g12447一个名为myfile的文件,g5194把从g19202盘输入字符存入该文件,当g19202盘上输入结g7475g7114关g19393该文件。g17885g6333正g11842内g4493g3647g12366。
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
第二部分 C语言程序设计同步训练
·281·
·281·
(2) A),r” B),r+” C),w” D),w+”
g989、g16786g16757g20076
g13546g1901一个程序,以g2494读g7053式g6183开一个文本文件 filea.txt,如果g6183开,将文件g3332g3348放在fp
文件指g19036中,g6183g993开,g7186g12046“Cann’t open filea.txt file \n.”,然后g17876出。
能力提高(B)
一、g3647g12366g20076
1,g991g19766程序g11013g19202盘输入字符,存放到文件中,用!结g7475输入,g16843在____________上g3647g12366。
#include <stdio.h>
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,g991g19766程序用变量count 统g16757文件中字符的个数。g16843在____________中g3647g1901正g11842内g4493。
#include <stdio.h>
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语言程序设计上机指导与同步训练
·282·
·282·
二、g17885g6333g20076
1,g14521有以g991定义和g16840g7138,
#include <stdio.h>
struct std
{ char num[6];
char name[8];
float mark[4];
}a[30];
FILE * fp;
g16786文件中以二进制形式存有g16780g3822g4410g10995的数据,g1000g5062g13475正g11842g6183开,文件指g19036定g1313在文件开g3848,g14521g16213从文件中读出30个g4410g10995的数据放入a数组中,以g991正g11842的g16833g2489是( )。
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,g16786有以g991结构体类型,
struct st
{ char name[8];
int num;
float s[4];
} student [20];
g5194g1000结构体数组 student 中的g1815g13044g18129g5062g13475有g1552,g14521g16213将g17837g1135g1815g13044g1901到 fp 所指向的磁盘文件中,以g991g993正g11842的形式是(g3g3g3g3)。
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<20;i++)
fwrite (student+i,sizeof(struct st ),1,fp);
3,以g991程序是将一个名为 old.dat 的文本文件g6347g17137到一个名为 new.dat 的g7044文本文件中,g16843g17885g6333正g11842内g4493g3647g12366。
#include <stdio.h>
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);
第二部分 C语言程序设计同步训练
·283·
·283·
}
A),r” B ),r+” C),rb” D),rb+”
A),W+,B),wb+” C),w” D),wb”
g989、g19394g12584g20076
1,什么叫“缓冲文件系统”?
g3247、g13546程g20076
1,从g19202盘输入一个字符g1030,将其中的g4579g1901字g8609g1852部g17728g6454g6116g3835g1901字g8609,然后输出到一个磁盘文件“test,中g1457存,输入的字符g1030以!表g12046结g7475。
链接二级考试
一、g17885g6333g20076
1,g14521g16213g6183开A盘上userg4388g11458g5417g991名为abc.txt的文本文件进g15904读、g1901g6817g1328,g991g19766符合
g8504g16213g8726的g2001数g16855用是( )。
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")
(2002g51924g7388)
2,g14521 fp g5062正g11842定义g5194指向g7588个文件,当g7422g17947到该文件结g7475g7643g5547g7114g2001数 feof(fp)的g1552为
( )。
A) 0 B) 1 C) g7131 D) 一个g197620g1552
(2003g51929g7388)
3,g991g19766的程序g6203g15904后,文件testt.t中的内g4493是( )。
#include <stdio.h>
void fun(char *fname.,char *st)
{ FILE *myf; int i;
myf=fopen(fname,“w” );
for(i=0;i<strlen(st); i++)fputc(st[i],myf);
fclose(myf);
}
main()
{ fun(“test”,“new world”; fun(“test”,“hello,”0;)
A)hello,B)new worldhello,C)new world D) hello,rld
(2001g51929g7388)
4,有以g991程序
#include <stdio.h>
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语言程序设计上机指导与同步训练
·284·
·284·
fclose(fp);
}
程序g17828g15904后的输出结果是( )。
A) 20 30 B) 20 50 C) 30 50 D) 30 20
(2002g51929)
二、g3647g12366g20076
1,以g991程序g8585g6183开文件后,先g2045用 fseekg2001数将文件g1313g13634指g19036定g1313在文件g7423g4626,然后
g16855用ftellg2001数g17832g3250当g2081文件g1313g13634指g19036的g1867体g1313g13634,从g13792g11842定文件长度,g16843g3647g12366。
FILE *myf; ling f1;
myf= _________ (“test.t”,“rb”);
fseek(myf,0,SEEK_END); f1=ftel(myf);
fclose(myf);
printf(“%d\n”,f1);
(2001g51929g7388)
2,g991g19766程序把从终端读入的 10 个g6984数以二进制g7053式g1901到一个名为 bi.dat 的g7044文件中,
g16843g3647g12366。
#include <stdio,h>
FILE *fp;
main()
{ int i,j;
if((fp=fopen(____________,"wb"))==NULL) exit(0);
for(i=0; i<10; i++)
{ scanf("%d",&j);
fwrite(&j,sizeof(int),1,_____________ );
}
fclose(fp);
(1999g51924g7388)
3,以g991程序用来统g16757文件中字符个数,g16843g3647g12366。
#include <stdio.h>
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);
}
(2002g51924g7388)
4,以g991程序中用户g11013g19202盘输入一个文件名,然后输入一g1030字符(用#结g7475输入)存放到g8504
文件文件中形g6116文本文件,g5194将字符的个数g1901到文件g4626部,g16843g3647g12366。
#include <stdio.h>
main( )
第二部分 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);
}
(1999g51929g7388)
5,以g991程序的g2163g14033是:从g19202盘上输入一个字符g1030,把该字符g1030中的g4579g1901字g8609g17728g6454为g3835g1901
字g8609,输出到文件test.txt中,然后从该文件读出字符g1030g5194g7186g12046出来,g16843g3647g12366。
#include <stdio.h>
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);
}