一.基础知识
在C语言中,文件操作有四个步骤:
① 定义文件指针;
② 打开文件:文件指针指向磁盘文件缓冲区;
③ 文件处理:文件读写操作;
④ 关闭文件。
文件打开函数如下:
fp=fopen("文件名","文件打开方式")
其功能是:使文件指针fp与相应文件实体对应起来,程序对文件指针进行操作,即fp代表磁盘文件。
函数fopen()若执行成功,则返回包含文件缓冲区等信息的FILE型地址,赋给文件指针fp;若不成功,则返回一个NULL(空值)。
文件关闭函数如下:
fclose(文件指针)
其功能是:把缓冲区中的数据写入磁盘扇区,确保写文件的正常完成;释放文件缓冲区单元和FILE结构体,使文件指针与具体文件脱钩。
若正常关闭文件,函数fclose()的返回值为0;若无法正常关闭文件,返回非0。
文件读写函数包括
字符读写函数: fgetc() / fputc()
字符串读写函数:fputs() / fgets()
格式化读写函数:fscanf() / fprintf()
二进制读写函数:fread ()/ fwrite()
其他相关函数:
检测文件结尾函数feof()
文件定位的函数fseek() 、rewind()
各函数的调用格式示例如下:
ch = fgetc( fp ) ;
从fp所指示的磁盘文件上读入一个字符到ch
fputc(ch, fp);
把一个字符 ch 写到 fp 所指示的磁盘文件上
fgets(s, n, fp);
从文本文件中读取字符串。其中,s可以是字符数组名或字符指针;n指定读入的字符个数;fp代表文件指针。
函数被调用时,最多读取n-1个字符,并将读入的字符串存入s所指向内存地址开始的n-1个连续的内存单元中。
当函数读取的字符达到指定的个数,或接收到换行符,或接收到文件结束标志EOF时,将在读取的字符后面自动添加一个’\0’字符;若有换行符,则将换行符保留(换行符在’\0’字符之前);若有EOF,则不保留。
fputs(s, fp);
向指定的文本文件写入一个字符串s,字符串s中的结束符’\0’不写入文件。
fscanf(文件指针,格式字符串,输入表);
fprintf(文件指针,格式字符串,输出表);
指定格式的输入输出函数。
fread(buffer, size, count, fp);
从二进制文件中读入一个数据块到变量
fwrite(buffer, size, count, fp);
向二进制文件中写入一个数据块
其中,四个参数说明如下:
buffer:指针,表示存放数据的首地址;
size:数据块的字节数;
count:要读写的数据块块数;
fp:文件指针。
feof(fp) ;
判断fp指针是否已经到文件末尾,若到文件结束位置,函数返回值1;若文件未结束,函数返回值0。
rewind(fp);
定位文件指针,使文件指针指向读写文件的首地址,即打开文件时文件指针所指向的位置。
fseek(fp, offset, from);
其中,offset为移动偏移量,long型;from表示起始位置,文件首部、当前位置和文件尾部分别对应0,1,2,或常量SEEK_SET、SEEK_CUR、SEEK_END。
例如:fseek(fp, 20L, 0):将文件位置指针移动到离文件首20字节处;fseek(fp, -20L, SEEK_END):将文件位置指针移动到离文件尾部前20字节处。
二.程序填空题练习题
1.给定程序中,函数fun的功能是:将指定源文件中的内容复制到指定的目标文件中,复制成功时函数返回值为1,失败时返回值为0。
请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <stdlib.h>
int fun(char *source, char *target)
{
FILE *fs,*ft;
char ch;
/**********found**********/
if((fs=fopen(source, ___1___))==NULL)
return 0;
if((ft=fopen(target, "w"))==NULL)
return 0;
printf("\nThe data in file :\n");
ch=fgetc(fs);
/**********found**********/
while(!feof(___2___))
{
putchar( ch );
/**********found**********/
fputc(ch,___3___);
ch=fgetc(fs);
}
fclose(fs);
fclose(ft);
printf("\n\n");
return 1;
}
int main()
{
char sfname[20] ="myfile1",tfname[20]="myfile2";
FILE *myf;
int i;
char c;
myf=fopen(sfname,"w");
printf("\nThe original data :\n");
for(i=1; i<30; i++)
{
c='A'+rand()%25;
fprintf(myf,"%c",c);
printf("%c",c);
}
fclose(myf);
printf("\n\n");
if (fun(sfname, tfname)) printf("Succeed!");
else printf("Fail!");
return 0;
}
2.给定程序中,函数fun的功能是:将参数给定的字符串、整数、浮点数写到文本文件中,再用字符方式从此文本文件中读入,并调用库函数atoi和atof将字符串转换成相应的整数、浮点数,然后将其显示在屏幕上。
请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <stdlib.h>
void fun(char *s, int a, double f)
{
/**********found**********/
__1__ fp;
char str[100], str1[100], str2[100];
int a1;
double f1;
fp = fopen("file1.txt", "w");
fprintf(fp, "%s %d %f\n", s, a, f);
/**********found**********/
__2__ ;
fp = fopen("file1.txt", "r");
/**********found**********/
fscanf(__3__,"%s%s%s", str, str1, str2);
fclose(fp);
a1 = atoi(str1);
f1 = atof(str2);
printf("\nThe result :\n%s %d %f\n",str,a1,f1);
}
int main()
{
char a[10]="Hello!";
int b=12345;
double c= 98.76;
fun(a,b,c);
return 0;
}
3.给定程序中,函数fun的功能是:将形参给定的字符串、整数、浮点数写到文本文件中,再用字符方式从此文本文件中逐个读入并显示在屏幕上。
请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
void fun(char *s, int a, double f)
{
/**********found**********/
__1__ fp;
char ch;
fp = fopen("file1.txt", "w");
fprintf(fp, "%s %d %f\n", s, a, f);
fclose(fp);
fp = fopen("file1.txt", "r");
printf("\nThe result :\n\n");
ch = fgetc(fp);
/**********found**********/
while (!feof(__2__))
{
/**********found**********/
putchar(__3__); ch = fgetc(fp);
}
putchar('\n');
fclose(fp);
}
int main()
{
char a[10]="Hello!";
int b=12345;
double c= 98.76;
fun(a,b,c);
return 0;
}
4.给定程序中,函数fun的功能是:将自然数1~10以及它们的平方根保存到名为myfile3.txt的文本文件中,然后再顺序读出显示在屏幕上。
请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <math.h>
int fun(char *fname )
{
FILE *fp;
int i,n;
float x;
if((fp=fopen(fname,"w"))==NULL) return 0;
for(i=1;i<=10;i++)
/**********found**********/
fprintf(___1___,"%d %f\n",i,sqrt((double)i));
printf("\nSucceed!!\n");
/**********found**********/
___2___;
printf("\nThe data in file :\n");
/**********found**********/
if((fp=fopen(___3___,"r"))==NULL)
return 0;
fscanf(fp,"%d%f",&n,&x);
while(!feof(fp))
{
printf("%d %f\n",n,x);
fscanf(fp,"%d%f",&n,&x);
}
fclose(fp);
return 1;
}
int main()
{
char fname[]="myfile3.txt";
fun(fname);
return 0;
}
5.给定程序的功能是:从键盘输入若干行文本(每行不超过80个字符),写到文件myfile4.txt中,用-1(独立一行)作为字符串输入结束的标志。然后将文件的内容读出显示在屏幕上。
请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void WriteText(FILE *);
void ReadText(FILE *);
int main()
{
FILE *fp;
if((fp=fopen("myfile4.txt","w"))==NULL)
{ printf(" open fail!!\n"); exit(0); }
WriteText(fp);
fclose(fp);
if((fp=fopen("myfile4.txt","r"))==NULL)
{ printf(" open fail!!\n"); exit(0); }
ReadText(fp);
fclose(fp);
}
/**********found**********/
void WriteText(FILE ___1___)
{
char str[81];
printf("\nEnter string with -1 to end :\n");
gets(str);
while(strcmp(str,"-1")!=0)
{
/**********found**********/
fputs(___2___,fw); fputs("\n",fw);
gets(str);
}
}
void ReadText(FILE *fr)
{
char str[81];
printf("\nRead file and output to screen :\n");
fgets(str,81,fr);
while( !feof(fr) )
{
/**********found**********/
printf("%s",___3___);
fgets(str,81,fr);
}
}
6.给定程序的功能是调用函数fun建立班级通讯录。通讯录中记录每位学生的编号、姓名和电话号码。班级的人数和学生的信息从键盘读入,每个人的信息作为一个数据块写到名为myfile5.dat的二进制文件中。
请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <stdlib.h>
#define N 5
typedef struct
{
int num;
char name[10];
char tel[10];
}STYPE;
void check();
/**********found**********/
int fun(___1___ *std)
{
/**********found**********/
___2___ *fp;
int i;
if((fp=fopen("myfile5.dat","wb"))==NULL)
return (0);
printf("\nOutput data to file !\n");
for(i=0; i<N; i++)
/**********found**********/
fwrite(&std[i], sizeof(STYPE), 1, _3_);
fclose(fp);
return (1);
}
int main()
{
STYPE s[10]={{1,"aaa","1111"},{1,"bbb","2222"},
{1,"ccc","3333"}, {1,"ddd","4444"},
{1,"eee","5555"}};
int k;
k=fun(s);
if (k==1)
{ printf("Succeed!"); check(); }
else
printf("Fail!");
return 0;
}
void check()
{
FILE *fp;
int i;
STYPE s[10];
if((fp=fopen("myfile5.dat","rb"))==NULL)
{ printf("Fail !!\n"); exit(0); }
printf("\nRead file and output to screen :\n");
printf("\n num name tel\n");
for(i=0; i<N; i++)
{
fread(&s[i],sizeof(STYPE),1, fp);
printf("%6d %s %s\n",s[i].num,s[i].name,s[i].tel);
}
fclose(fp);
}
7.给定程序中,通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。所有学生数据均以二进制方式输出到文件中。函数fun的功能是:重写形参filename所指文件中最后一个学生的数据,即用新的学生数据覆盖该学生原来的数据,其他学生的数据不变。
请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#define N 5
typedef struct student
{
long sno;
char name[10];
float score[3];
} STU;
void fun(char *filename, STU n)
{
FILE *fp;
/**********found**********/
fp = fopen(__1__, "rb+");
/**********found**********/
fseek(fp, -1L*sizeof(STU), __2__);
/**********found**********/
fwrite(__3__, sizeof(STU), 1, fp);
fclose(fp);
}
int main()
{
STU t[N]={ {10001,"MaChao", 91, 92, 77},
{10002,"CaoKai", 75, 60, 88},
{10003,"LiSi", 85, 70, 78},
{10004,"FangFang", 90, 82, 87},
{10005,"ZhangSan", 95, 80, 88}};
STU n={10006,"ZhaoSi", 55, 70, 68}, ss[N];
int i,j;
FILE *fp;
fp = fopen("student.dat", "wb");
fwrite(t, sizeof(STU), N, fp);
fclose(fp);
fp = fopen("student.dat", "rb");
fread(ss, sizeof(STU), N, fp);
fclose(fp);
printf("\nThe original data :\n\n");
for (j=0; j<N; j++)
{
printf("\nNo:%ld Name: %-8s Scores: ",ss[j].sno, ss[j].name);
for (i=0; i<3; i++) printf("%6.2f ", ss[j].score[i]);
printf("\n");
}
fun("student.dat", n);
printf("\nThe data after modifing :\n\n");
fp = fopen("student.dat", "rb");
fread(ss, sizeof(STU), N, fp);
fclose(fp);
for (j=0; j<N; j++)
{
printf("\nNo: %ld Name: %-8s Scores: ",ss[j].sno, ss[j].name);
for (i=0; i<3; i++) printf("%6.2f ", ss[j].score[i]);
printf("\n");
}
return 0;
}
8.给定程序中,通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。所有学生数据均以二进制方式输出到文件中。函数fun的功能是:从形参filename所指的文件中读入学生数据,并按照学号从小到大排序后,再用二进制方式把排序后的学生数据输出到filename所指的文件中,覆盖原来的文件内容。
请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#define N 5
typedef struct student
{
long sno;
char name[10];
float score[3];
} STU;
void fun(char *filename)
{
FILE *fp;
int i, j;
STU s[N], t;
/**********found**********/
fp = fopen(filename, __1__);
fread(s, sizeof(STU), N, fp);
fclose(fp);
for (i=0; i<N-1; i++)
for (j=i+1; j<N; j++)
/**********found**********/
if (s[i].sno __2__s[j].sno)
{ t=s[i]; s[i]=s[j]; s[j]=t; }
fp = fopen(filename, "wb");
/**********found**********/
__3__(s, sizeof(STU), N, fp);
fclose(fp);
}
int main()
{
STU t[N]={ {10005,"ZhangSan", 95, 80, 88},
{10003,"LiSi", 85, 70, 78},
{10002,"CaoKai", 75, 60, 88},
{10004,"FangFang", 90, 82, 87},
{10001,"MaChao", 91, 92, 77}}, ss[N];
int i,j;
FILE *fp;
fp = fopen("student.dat", "wb");
fwrite(t, sizeof(STU), 5, fp);
fclose(fp);
printf("\n\nThe original data :\n\n");
for (j=0; j<N; j++)
{
printf("\nNo: %ld Name: %-8s Scores: ",t[j].sno, t[j].name);
for (i=0; i<3; i++)
printf("%6.2f ", t[j].score[i]);
printf("\n");
}
fun("student.dat");
printf("\n\nThe data after sorting :\n\n");
fp = fopen("student.dat", "rb");
fread(ss, sizeof(STU), 5, fp);
fclose(fp);
for (j=0; j<N; j++)
{
printf("\nNo: %ld Name: %-8s Scores: ",ss[j].sno, ss[j].name);
for (i=0; i<3; i++)
printf("%6.2f ", ss[j].score[i]);
printf("\n");
}
return 0;
}
9.给定程序中,通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。所有学生数据均以二进制方式输出到student.dat文件中。函数fun的功能是:从指定文件中找出指定学号的学生数据,读入此学生数据,对该生的分数进行修改,使每门课的分数加3分,修改后重写文件中该学生的数据,即用该学生的新数据覆盖该学生原来的数据,其他学生的数据不变;若找不到,则什么都不做。
请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#define N 5
typedef struct student
{
long sno;
char name[10];
float score[3];
} STU;
void fun(char *filename, long sno)
{
FILE *fp;
STU n;
int i;
fp = fopen(filename,"rb+");
/**********found**********/
while (!__1__)
{
fread(&n, sizeof(STU), 1, fp);
/**********found**********/
if (n.sno__2__) break;
}
if (!feof(fp))
{
for (i=0; i<3; i++) n.score[i] += 3;
/**********found**********/
fseek(fp, -1L*__3__, SEEK_CUR);
fwrite(&n, sizeof(STU), 1, fp);
}
fclose(fp);
}
int main()
{
STU t[N]={{10001,"MaChao", 91, 92, 77},
{10002,"CaoKai", 75, 60, 88},
{10003,"LiSi", 85, 70, 78},
{10004,"FangFang", 90, 82, 87},
{10005,"ZhangSan", 95, 80, 88}}, ss[N];
int i,j;
FILE *fp;
fp = fopen("student.dat", "wb");
fwrite(t, sizeof(STU), N, fp);
fclose(fp);
printf("\nThe original data :\n");
fp = fopen("student.dat", "rb");
fread(ss, sizeof(STU), N, fp);
fclose(fp);
for (j=0; j<N; j++)
{
printf("\nNo: %ld Name: %-8s Scores: ",ss[j].sno, ss[j].name);
for (i=0; i<3; i++)
printf("%6.2f ", ss[j].score[i]);
printf("\n");
}
fun("student.dat", 10003);
fp = fopen("student.dat", "rb");
fread(ss, sizeof(STU), N, fp);
fclose(fp);
printf("\nThe data after modifing :\n");
for (j=0; j<N; j++)
{
printf("\nNo: %ld Name: %-8s Scores: ",ss[j].sno, ss[j].name);
for (i=0; i<3; i++)
printf("%6.2f ", ss[j].score[i]);
printf("\n");
}
return 0;
}
1.(1)"r" (2)fs (3)ft 2.(1)FILE * (2)fclose(fp) (3)fp 3.(1)FILE * (2)fp (3)ch 4.(1)fp (2)fclose(fp) (3)fname 5.(1)*fw (2)str (3)str 6.(1)STYPE (2)FILE (3)fp 7.(1)filename (2)SEEK_END (3)&n 8.(1)"rb" (2)> (3)fwrite 9.(1)feof(fp) (2)==sno (3)sizeof(STU)
程序填空题练习题参考答案