综合训练二 文件的基本操作
一、实验学时 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
免责声明:本站部分内容从网络整理而来,只供参考!如有版权问题可联系本站删除。