一.基础知识

在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时,将在读取的字符后面自动添加一个’’字符;若有换行符,则将换行符保留(换行符在’’字符之前);若有EOF,则不保留。

        fputs(s, fp);

向指定的文本文件写入一个字符串s,字符串s中的结束符’’不写入文件。

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("nn");

    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("nn");

    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  %fn", 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 %fn",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 %fn", s, a, f);

    fclose(fp);

    fp = fopen("file1.txt", "r");

    printf("nThe result :nn");

    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 %fn",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 %fn",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      teln");

   for(i=0; i<N; i++)

   { 

      fread(&s[i],sizeof(STYPE),1, fp);

      printf("%6d %s %sn",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 :nn");

    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 :nn");

    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("nnThe original data :nn");

    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("nnThe data after sorting :nn");

    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     (3sizeof(STU)
程序填空题练习题参考答案
内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/cs-whut/p/16887882.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!

相关课程