C语言 第九章 文件系统 重点 典型题

一、概念

二、其他代码(书本)

三、重点题目

1、能作为输入文件名字符串常量的是( )

A.  c:user\text.txt

B.  c:\user\text.txt

C.  "c:\user\text.txt"

D.  "c:\\user\\text.txt"

答案:D

解析:在C语言中反斜线“\”是最为转义字符开始的标志,表示反斜线字符应为“\\”,因此要表示文件存取路径c:\user\text.txt,在C语言中应该表示为"c:\\user\\text.txt"。

2、若执行fopen函数时发生错误,则函数的返回值是( )

A.  地址值             B.  0          C.  1         D.  EOF

答案:B

解析:打开文件函数fopen发生错误,导致文件读取或建立失败,这时fopen的返回值是NULL,在C语言中,将NULL作为一个宏名来处理,是用字符0来表示的,因此应选B。

3、若要用fopen函数打开一个新的二进制文件,该文件既要能读也要能写,则文件打开方式字符串应是( )。

A.  "ab+"           B.  "wb+"           C.  "rb+"           D.  "ab"

答案:B

解析:要求用fopen打开一个新的文件,说明磁盘上没有该文件,要生成一个,则用"w"模式,二进制文件要用"b"模式,能读能写要用"+"模式,组合起来就是"wb+"形式。

4、若以"a+"方式打开一个已存在的文件,则以下叙述正确的是( )

A.  文件打开时,原有的文件内容不被删除,位置指针移到文件末尾,可作添加和读操作

B.  文件打开时,原有的文件内容不被删除,位置指针移到文件开头,可作重写和读操作

C.  文件打开时,原有的文件内容被删除,只可作写操作

D.  以上说法都不正确

答案:A

解析:"a"模式是指针移到文件末尾并向文件进行添加操作,"+"模式表示文件能读取能写,因此应选A。

5、利用fseek函数可实现的操作是( )

A.  改变文件位置的指针

B.  文件的顺序读写

C.  文件的随机读写

D.  以上答案均正确

答案:A

解析:fseek函数是对文件进行定位,其形式是int fseek(FILE *fp, long offset, int origin);,当origin=0时,表示从文件开头计算;当origin=1时,表示从文件指针当前位置计算;当origin=2时,表示从文件末尾计算。因此应选A。

6、函数调用语句fseek(fp,-20L,2)的含义是( )

A.  将文件位置指针移到距离文件头20个字节处

B.  将文件位置指针从当前位置向后移动20个字节

C.  将文件位置指针从文件末尾向前移动20个字节

D.  将文件位置指针移到当前位置20个字节处

答案:C

解析:fseek(fp,-20L,2)中origin=2,表示从文件末尾计算,-20L表示文件指针从文件尾向前移动20个字节,因此应选C。

7、fgetc函数的作用是从指定文件读入一个字符,该文件的打开方式必须是( )

A.  只写              B.  追加             C.  读或读写              D.  B和C都正确

答案:D

解析:fgetc函数的作用于从指定文件读取一个字符,对应的文件打开模式可以是读("r")、读写("r+")、追加("a"),因此选择D。

8、函数rewind的作用是( )

A.  使位置指针重新返回文件的开头

B.  将位置指针指向文件中所要求的特定位置

C.  使位置指针指向文件的末尾

D.  使位置指针自动移至下一个字符位置

答案:A

解析:rewind函数的声明形式为void rewind(FILE *fp);,其作用是重新返回文件起始位置,因此应选A。

9、函数ftell(fp)的作用是( )

A.  得到流式文件中的当前位置

B.  移动流式文件的位置指针

C.  初始化流式文件的位置

D.  以上答案均正确

答案:A

解析:ftell函数的声明形式是long ftell(FILE *fp);,表示返回文件指针的当前位置,因此应选A。

10、C语言流式文件的两种形式是   文本文件      二进制文件   

解析:C语言中文件按存储形式分为文本文件(ASCII码文件)和二进制文件。

11、C语言打开文件的函数是    fopen    ,关闭文件的函数是    fclose    

解析:C语言中,要用FILE定义的文件型指针指向文件,必须用fopen函数打开文件,当问及使用完毕要用fclose函数关闭。

12、按指定格式输出数据到文件的函数是    fprintf    ,按指定格式从文件输入数据的函数是    fscanf    ,判断文件指针到文件末尾的函数是    feof    

解析:用fopen函数打开的文件,要按指定格式将从文件中读取的数据赋给指定变量,应用fscanf函数:要将变量的值按指定格式写入文件,应用fprintf函数;判断文件指针是否指到文件尾的函数是feof函数。

13、输出一个数据块到文件中的函数是    fwrite    ,从文件中输入一个数据块的函数是    fread    ,输出一个字符串到文件中的函数是    fputs    ,从文件中输入一个字符串的函数是    fgets    

解析:C语言中将数据块写入指定文件使用函数fwrite,从文件中读入数据块到计算机内存使用函数fread,将一个字符串写入到指定文件使用fputs函数,从文件中读取一个指定长度的字符串到计算机内存使用fgets函数。

14、在C程序中,数据可用    文本        二进制    两种编码方式存放。

15、feof(fp)函数是用来判断文件是否结束,如果遇到文件结束,函数值为    1    ,否则为    0    

解析:用函数feof判断文件是否结束。若指针指到文件结束,则为“真”,因此函数值为1;若指针没有指到文件结束,则为“假”,因此函数值为0 。

16、在C语言中,文件的存取是以    字节    为单位的,这种文件称作为    流式    文件。

解析:C语言中数据流是由一个个字符组成的,这样的字符是以ASCII码形式存储的,这些字符组成的文件称为文本文件(或流式文件)。

17、以下程序的功能是将文件file1.c的内容输入到屏幕上并复制到文件file2.c中,请填空使程序完整。

        #include <stdio.h>
        int main()
        {
              FILE *fp1,*fp2 ;
              fp1=fopen("file1.c","r");
              fp2=fopen("file2.c","w");
              while (!feof(fp1))
                   putchar(getc(fp1));
              rewind(fp1) ;
              while(!feof(fp1))
                   putc(fgetc(fp1),fp2);
              fclose(fp1);
              fclose(fp2);
              return 0;
        }

解析:C语言中要使用文件,必须先定义文件类型的指针变量,使指针变量指向文件,通过对指针变量的操作实现对文件的操作。题目中对两个文件进行操作,必须定义两个文件型指针变量,因此第一空应填“*fp1,*fp2”。循环读出文件指针fp1指向文件开头,因此第二空填rewind(fp1)。第三空是将fp1所指向的文件内容读出,写入fp2所指向的文件,因此应填fgetc(fp1),fp2。

18、以下程序的功能是将文件stud_data中第i个学生的姓名、学号、性别输出,请填空使程序完整。

        #include <stdio.h>
        struct student_type
        {
              char name[10];
              int num;
              int age;
              char sex;
        }stud[10];
        int main()
        {
              int i;
              FILE *fp;
              if(fp1=fopen("stud_data","rb"))==NULL
              {
                     printf("error!\n");
                     exit(0);
              }
              scanf("%d",&i);
              fseek(fp,sizeof(stud[0]*i,0));
              fread(&stud[i],sizeof(struct student_type),1,fp);
              printf("%s%d%d%c\n",stud[i].name,stud[i].num,stud[i].age,stud[i].sex);
              fclose(fp);
              return 0;
        }

解析:在C语言中要使用文件,必须先定义文件类型的指针变量,使指针变量指向文件,通过对指针变量的操作实现对文件的操作,因此第一空应填“*fp”。要读取第i个学生的信息,应将文件指针定位到第i个学生处,因此第二空填“fp,sizeof(stud[0])*i,0”或“fp,sizeof(struct student_type*i,0”。第二空是将读出的第i个学生信息赋值给结构体数组元素,因此应填&stud[i]。

19、以下程序的功能是用变量count统计文件中的字符个数,请填空使程序完整。

        #include <stdio.h>
        int main()
        {
               FILE *fp;
               long count=0;
               if((fp=fopen("letter.dat","r"))==NULL)
               {
                      printf("error!\n");
                      exit(0);
               }
               while (!feof(fp))
               {
                      fgetc(fp);
                      count++;
               }
               printf("count=%ld\n",count);
               fclose(fp);
               return 0;
         }

解析:从磁盘中读出文件进行字符统计,因此第一空应填"r"(打开文件模式为只读方式)。第二空是从指针指向的文件中读取一个字符,因此应填fgetc(fp)。第三空是字符数增加1,因此应填count++。

20、以下程序从一个二进制文件中读入结构体数据,并把结构体数据显示在屏幕上,请填空使程序完整。

       #include <stdio.h>
       struct rec
       {
             int num;
             float total;
       }
       void recout (FILE *f)
       {
             struct rec r;
             while(!feof(f))
             {
                   fread(&r,sizeof(r),1,f);
                   printf("%d,%f\n",r.num,r.total);
             }
       }
       int main()
       {
             FILE *f;
             long count=0;
             f=fopen("bin.bat","rb");
             recout(f);
             fclose(f);
             return 0;
       }

解析:第一空是用文件型指针作函数recout的参数,因此应填FILE *f。第二空是用fread函数从文件中读取一个数据块,应填这样的数据块所占的内存大小sizeof(r)或sizeof(struct rec)。第三空是输出从文件中读出的数据成员的值,应填“r.num.total”。

21、有N个学生,每个学生有M门课的成绩,从键盘输入数据(包括学号、姓名、3门课成绩),实现满足以下要求的功能:

(1)计算出平均成绩,将原有的数据和计算出的平均成绩放在磁盘文件student.txt中。

(2)对学生的成绩按平均成绩排序后,将原有的数据和计算出的平均成绩存放在磁盘文件sort.txt中。

(3)对排序后的数据再添加一个学生的成绩,将原有的数据和计算出的平均成绩存放在磁盘文件sort2.txt中。

解析:

程序如下:

#include <stdio.h>
#define N 5      /*学生人数*/
#define M 3      /*课程数*/ 
struct stu       /*定义结构体类型*/
{
    char name[15];
    char num[6];
    float score[M];
    float aver;
} student[N]; /*说明结构体变量*/
void sort(struct stu student[]);
void writetofile(struct stu student[], char filename[],char mode[]);
int main()
{
    FILE *fp;
    struct stu *ptr=NULL;
    int i,j;
    printf("input data:\n");
    for(i=0;i<N;i++)
    {
        scanf("%s %s",student[i].name,student[i].num);
        student[i].aver = 0;
        for(j=0;j<M;i++)
        {
            scanf("%f",&student[i].score[j]);
            student[i].aver += student[i].score[j];
        }
        student[i].aver = student[i].aver/M;
    }
    writetofile(student,"student.txt","w");
    writetofile(student,"sort.txt","w");
    writetofile(student,"sort2.txt","w");
    sort(student);
    writetofile(student,"student.txt","a");
    scanf("%s %s", ptr->name,ptr->num);
    ptr->aver =0;
    for(j=0;j<M;j++)
    {
        scanf("%f",&ptr->score[j]);
        ptr->aver += ptr->score[j];
    }
    if((fp=fopen("sort2.txt","a"))==NULL)
    {
        printf("cannot open file");
        exit(0);
    }
    fprintf(fp,"%s %s",ptr->name,ptr->num);
    for(j=0;j<M;j++)
        fprintf(fp,"%7.2f", ptr->score[j]);
    fprintf(fp,"%7.2f\n",ptr->aver/M);
    fclose(fp);
    return 0;
}
void sort(struct stu student[])
{
    struct stu temp;
    int i,j,k;
    for(i=0;i<N-1;i++)
    {
        k=i;
        for(j=i+1;j<N;j++)
            if(student[j].aver < student[k].aver)
                k=j;
        if(k!=i)
        {
            temp=student[i];
            student[i]=student[k];
            student[k]=temp;
        }
    }
}
void writetofile(struct stu student[], char filename[],char mode[])
{
    FILE *p;
    int i,j;
    if((fp=fopen(filename,mode))==NULL)
    {
        printf("cannot open file");
        exit(0);
    }
    for(i=0;i<N;i++)
    {
        fprintf(fp,"%s %s",student[i].name,student[i].num);
        for(j=0;j<M;j++)
            printf(fp,"%7.2f", student[i].score[j]);
        printf(fp,"%7.2f\n", student[i].aver/M);
    }
    fclose(fp);
}

 

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页