一.基础知识

在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;

}

计算机等级考试二级C语言程序设计专项训练题——文件操作计算机等级考试二级C语言程序设计专项训练题——文件操作

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     (3sizeof(STU)

程序填空题练习题参考答案

发表回复