联系方式

  • QQ:99515681
  • 邮箱:99515681@qq.com
  • 工作时间:8:00-21:00
  • 微信:codinghelp

您当前位置:首页 >> C/C++编程C/C++编程

日期:2018-05-04 09:38

综合训练二  文件的基本操作

一、实验学时  4学时

二、实验目的

1.掌握文件打开、关闭、读写等操作函数的使用方法。

2.掌握包含文件操作的程序设计和调试方法。

三、实验内容

1. 建立文件data.tat,从键盘上向data1.dat文件写入10个实型数据,同时在显示器上输出(使用fscanf和fprintf函数实现)。

编程提示:

(1)使用文件的打开、关闭、写入等函数;

(2)首先打开文件,然后写入10个数,最后关闭文件。

程序如下:

#include <stdio.h>

main()

{ FILE  *fp;                         /* 定义一个文件指针变量fp */

int i;

float x;

fp=fopen("data1.dat","w");      /* 创建文件时,以写方式打开文本文件 */

for(i=1;i<=10;i++)  

{ scanf("%f",&x);            /* 将数据读入x */

    fprintf(fp,"%f\n",x);  /* 将数据输出到文件data中,即写到data中 */

 printf("%f\n",x); 

       /*将数据输出到屏幕上,以察看文件内容是否与之前的输入一致*/

}

fclose(fp);                       /* 读文件结束,关闭文件 */

}


说明:格式化读写函数 fscanf、fprintf函数与前面使用的scanf和printf 函数的功能相似,都是格式化读写函数。 两者的区别在于 fscanf 函数和fprintf函数的读写对象不是键盘和显示器,而是磁盘文件。

 这两个函数的调用格式为:

      fscanf(文件指针,格式字符串,输入表列);

          fprintf(文件指针,格式字符串,输出表列);

例如: fscanf(fp,"%d%s",&i,s);     fprintf(fp,"%d%c",j,ch);



2. 从键盘上输入10个整数,并写入到一磁盘文件中,然后再读取输出(使用fread和fwrie函数实现)。

程序如下:

#include "stdio.h"

main( )

{  FILE *fp;

  int i,j,k;

  int a[10],b[10];

  char filename[20];

  printf("Enter the file name:");

  gets(filename);               /*输入要建立的磁盘文件名*/

  fp=fopen(filename,"wb");        /*以二进制写方式建立磁盘文件*/

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

   { scanf("%d",&a[i]);         /*从键盘输入整数,读入到内存*/

     fwrite(a+i,sizeof(int),1,fp);     /*从内存中写到磁盘上*/

   }

  fclose(fp);                  /*关闭文件*/

  fp=fopen(filename,"rb");       /*以二进制只读方式打开磁盘文件*/

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

  { fread(b+i,sizeof(int),1,fp);       /*从磁盘上读入内存*/

    printf("%6d",b[i]); }             /*在显示器上输出显示*/    

printf("\n");

  fclose(fp);                  /*关闭文件*/

}

说明:该程序中使用了fread函数和fwrite函数用来读写一组数据,要注意这两个函数的各个参数项的含义。本程序中fwrite(a+i,sizeof(int),1,fp)的第一个参数a+i用来代表从内存中向文件输出的数据的首地址,第二个参数sizeof(int)用来表示每次读取的字节数,由于是整数,可以用sizeof()函数返回int数据的字节数,或者直接写为2亦可.


3. 建立一个磁盘文件fsin,其内容是0~90°之间每隔5°的正弦值。

程序如下:

#include<stdio.h>

#include<math.h>

#define PI 3.14159

main( )

{

FILE  *fp;

float S[19];

int i, a;

if((fp=fopen(“fsin”, “wb”))==NULL)

{ printf(“Cannot open file.\n”);

exit(0);

}

for(i=0,a=-5; i<19; i++)

{a+=5;

S[i]=sin(a*PI/180.0);

If (fwrite(S,sizeof(S), 1, fp) != 1)

printf(“File error.”);

fclose(fp);

}

}


4.把上题所建立的文件fsin的内容读出并打印。

程序如下:

#include<stdio.h>

main( )

{

FILE  *fp;

float  S[19];

int i, a;

if((fp=fopen(“fsin”,“rb”))==NuLL)

{ printf(“Cannot open file.\n”);

exit(0);

}

if (fread(S, sizeof(S), 1, fp) != 1)

printf(“File error.”);

printf(“\n I     sin(i) \n\n”);

for(i=0,a=-5; i<19; i++)

{ a+=5;

printf(“%2d%11.4f\n”, a, S[i]);

}

fclose(fp);

}


5. 从键盘输入若干行字母,(每行长度不等)输入后把他们存储到一磁盘文件text.txt中.再从该文件读入这些数据,将其中小写字母转换成大写字母后在显示屏上输出.。

程序如下:

#include "stdio.h"

main ( )

{

 int  i, flag;

 char  c, str[80];

 FILE  *fp;

 fp=fopen("text.txt","w");     /*以只写方式建立或者打开磁盘文件*/

 flag=1;                  /*置标志变量flag的值为1*/

 while (flag==1)

  { printf("\nInput   string:\n");

    gets(str);                  /*输入一行字符串*/

    fprintf(fp,"%s",str);         /*从内存中写到磁盘文件中*/        

    printf("\nCountiune?");       /*是否继续输入下一行*/

    c=getchar( );

    if ((c=='N')|| (c=='n'))

     flag=0;              /*如果不继续输入,置标志变量flag的值为0*/

   }

 fclose(fp);

 fp=fopen("text.txt","r");     /*以只读方式建立或者打开磁盘文件*/

 while (fscanf(fp,"%s",str)!=EOF)     /*判定是否读到文件末尾*/

  { for(i=0;str[i]!='\0';i++)

     if((str[i]>='a')&&(str[i]<='z'))

    str[i]= str[i]-32;           /*将小写字母转换成对应的大写字母*/

    printf("\n%s\n",str);

  }

 fclose(fp);

}

说明:该程序定义了一个一维字符数组来存放输入的一行字符串,,在程序中通过从键盘上输入一个字符来确定是否继续输入字符串,要注意的是程序中设置了标志变量来判定是否要继续。



6. 利用fwrite与fread函数建立一个存放学生电话簿的二进制数据文件,并读取其中的数据。

编程提示:电话簿为结构体类型,其中包含姓名、电话号码。先建立该文件,文件名由用户从键盘输入,读进字符数组filename中。

程序如下:

#include "stdio.h"

main( )

{ FILE *fp; int i;

 char filename[40];              /* filename用于存放数据文件名 */

 struct tel

  { char name[20], tel[9]; } in[5], out[5];

 clrscr( );

 printf("filename: ");

 gets(filename);

 if ((fp=fopen(filename,"wb"))==NULL)

  { printf("Can't open the %s\n",filename);

     exit(0);

   }

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

    { printf("name: ");

       gets(in[i].name);

       printf("tel: ");

       gets(in[i].tel);

     }

 fwrite(in, sizeof(struct tel), 5, fp);   /* 文件中写入5个学生的电话 */

 fclose(fp);                            /* 建立文件结束,关闭文件 */

 printf("\n\n outfile:\n");

 fp=fopen(filename,"rb");              /* 以读方式打开二进制文件 */

 fread(out,sizeof(struct tel),5,fp);    /* 从文件读取5个结构体数据 */

 printf("name                telephone\n");

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

    printf("%-20s%-8s\n",out[i].name,out[i].tel);

 fclose(fp);                             /* 读文件结束,关闭文件 */

}



7.从键盘输入两个学生数据,写入到一个磁盘文件中,再从文件中读出这两个学生的数据显示在屏幕上。

程序如下:

#include "stdio.h"

struct stu                          /*定义一个结构体*/

{

 char name[10];

 int num;

 int age;

 char addr[15];

}s1[2],s2[2];

main( )

{

 FILE *fp;

 char ch;

 int i;

 if((fp=fopen("e:\\stu_list.dat","wb"))==NULL)  

/*以二进制写方式建立磁盘文件*/

 {

   printf("Cannot open file strike any key exit!");

   exit(0);

 }

 printf("\ninput data:\n");

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

   scanf("%s%d%d%s",s1[i].name,&s1[i].num,&s1[i].age,s1[i].addr);

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

   fwrite(&s1[i],sizeof(struct stu),2,fp);    /*从内存中写到磁盘上*/

 fclose(fp);       /*关闭文件*/

 fp=fopen("e:\\stu_list.dat","rb"); /*以二进制只读方式打开磁盘文件*/

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

  { fread(&s2[i],sizeof(struct stu),2,fp);    /*从磁盘上读入内存*/

      printf("%s\t%d\t%d\t%s\t",s2[i].name,s2[i].num,s2[i].age,s2[i].addr);

printf("\n");}

 fclose(fp);      /*关闭文件*/

}

说明:本例程序定义了一个结构体stu,说明了两个结构数组s1和s2。程序中以只写方式打开二进制文件“stu_list”,输入二个学生数据之后,写入该文件中,然后以只读方式打开该二进制文件,把文件内部位置指针移到文件首,读出两块学生数据后,在屏幕上显示。


8. 用fscanf和fprintf函数解决上题中的问题。

程序如下:

#include "stdio.h"

struct stu

{

  char name[10];

  int num;

  int age;

  char addr[15];

}s1[2],s2[2];

main()

{

 FILE *fp;

 char ch;

 int i;

 if((fp=fopen("e:\\stu_list.dat","wb"))==NULL)

 {

   printf("Cannot open file strike any key exit!");

   exit(0);

 }

 printf("\ninput data:\n");

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

  scanf("%s%d%d%s",s1[i].name,&s1[i].num,&s1[i].age,s1[i].addr);

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

  fprintf(fp,"%s\t%d\t%d\t%s\t",s1[i].name,s1[i].num,s1[i].age,

s1[i].addr);

 fclose(fp);

 fp=fopen("e:\\stu_list.dat","rb");

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

      { fscanf(fp,"%s%d%d%s",s2[i].name,&s2[i].num,&s2[i].age,s2[i].addr);

      printf("%s\t%d\t%d\t%s\t",s2[i].name,s2[i].num,s2[i].age,s2[i].addr);

        printf("\n");}

 fclose(fp);

}

说明:fscanf函数,fprintf函数与前面使用的scanf和printf 函数的功能相似,都是格式化读写函数。两者的区别在于fscanf函数和fprintf函数的读写对象不是键盘和显示器,而是磁盘文件。本程序中fscanf和fprintf函数每次只能读写一个结构数组元素,因此采用了循环语句来读写全部数组元素。


9.有5个学生有三门课的成绩,从键盘输入以上数据(包括学号、姓名、三门课的成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件“stud.dat”中。

程序如下:

#include "stdio.h"

struct student

{ char num[6];

char name[8];

int score[3];

float ave;

} stu[5];

main( )

{ int i,j,sum;

FILE *fp;

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

{ printf("\ninput score of sudent %d:\n",i+1);

printf("number:");

scanf("%s",stu[i].num);

printf("name: ");

scanf("%s",stu[i].name);

sum=0;

for(j=0;j<3;j++)

{ printf("score %d: ",j+1);

scanf("%d",&stu[i].score[j]);

sum+=stu[i].score[j];

}

stu[i].ave=sum/3.0;

}

fp=fopen("stu", "w");

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

if (fwrite(&stu[i],sizeof(struct student),1,fp)!=1)

printf("File write error\n");

fclose(fp);


/*将文件输出到显示器上,以检查文件内容*/

fp=fopen("stu", "r");

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

 { fread (&stu[i],sizeof(struct student),1,fp);

printf("\n%s,%s,%d,%d,%d,%6.2f\n",stu[i].num,stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].ave);

 }

}

说明:数据块读写函数fread和fwrite

C语言提供了用于整块数据的读写函数fread和fwrite。 可用来读写一组数据,如一个数组元素,一个结构变量的值等等。

读数据块函数调用的一般形式为: fread(buffer,size,count,fp);

写数据块函数调用的一般形式为: fwrite(buffer,size,count,fp);

其中buffer是一个指针,在fread函数中,它表示存放输入数据的首地址。在fwrite函数中,它表示存放输出数据的首地址。 size 表示数据块的字节数。count 表示要读写的数据块块数。fp 表示文件指针。

   例如:fread(fa,4,5,fp); 其意义是从fp所指的文件中,每次读4个字节(一个实数)送入实数组fa中,连续读5次,即读5个实数到fa中。


版权所有:编程辅导网 2021 All Rights Reserved 联系方式:QQ:99515681 微信:codinghelp 电子信箱:99515681@qq.com
免责声明:本站部分内容从网络整理而来,只供参考!如有版权问题可联系本站删除。 站长地图

python代写
微信客服:codinghelp