湖南大学c语言实验题目及其答案 5.docx
《湖南大学c语言实验题目及其答案 5.docx》由会员分享,可在线阅读,更多相关《湖南大学c语言实验题目及其答案 5.docx(14页珍藏版)》请在冰豆网上搜索。
湖南大学c语言实验题目及其答案5
第五章 文件
一.目的和要求
1、掌握文件的基本概念,如:
文件的输入/输出的基本概念、文件的两种组织形式、文件操作的一般步骤等等。
2、学习文件操作的基本算法,如:
读/写、追加等。
3、了解文件的读写方式,如:
顺序读写文件、随机读写文件。
4、了解如何将不同的数据(如:
数组数据、结构体数据)存入或读出文件的方法。
二.相关知识
1、文件概述
⑴文件的组织形式
C把文件看作是字符(字节)的序列,即由一个一个字符数据顺序组成的。
根据数据的组织形式,可分为ASCII文件和二进制文件。
①ASCII文件又称文本文件。
它的每一个字节放一个ASCII代码(代表一个字符)。
因而便于对字符进行逐个处理,也便于输出字符。
但一般占存储空间较多,而且化费转换时间。
2二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。
但一个字节并不对应一个字符。
不能直接输出字符形式。
⑵文件的处理方法
1缓冲文件系统:
系统自动地在内存区为每一个正在使用的文件开辟一个缓冲区。
从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去。
如果从磁盘向内存读入数据,则从磁盘文件中将一批数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(给程序变量)。
用缓冲文件系统进行的输入输出又称为高级(高层)磁盘输入输出。
②非缓冲文件系统:
系统不自动开辟缓冲区,系统直接对磁盘写或读数据。
用非缓冲文件系统进行的输入输出又称为低级(低层)磁盘输入输出系统。
⑶文件的存取方式
C语言对文件的操作都是通过文件处理函数实现的。
用文件处理函数存取文件的方式有两种,一种是顺序存取(顺序文件),另一种是随机存取(随机文件)。
⑷设备文件
由于计算机中的输入/输出设备的作用也是输入输出数据,所以把输入/输出设备也看成文件,称为设备文件。
微机上配备的常用输入设备是键盘,称标准输入设备;常用输出设备是显示器,称标准输出设备;还有一个专用于输出错误信息的标准错误输出设备,也是显示器。
2、文件型指针
C语言规定文件类型是一种特殊的“结构型”FILE,对这个结构类型FILE,系统已经在头文件“stdio.h”中进行了定义。
3、操作文件的常用函数
①打开文件函数open()
②关闭文件函数close()
③文件尾测试函数feof()
④字符读/写函数fgetc()/fputc()
⑤字符串读/写函数fgets()/fputs()
⑥数据读/写函数fread()/fwrite()
⑦格式读/写函数fscanf()/fprintf()
⑧文件头定位函数rewind()
⑨文件随机定位函数fseek()
10错误测试函数ferror()
三.实验练习
实验练习1:
编写程序,模拟DOS的type命令,显示文本文件的内容。
本练习要求在封闭式实验课中在助教或者讲师的指导下完成。
本练习分成6个部分:
1.实验目的
2.问题描述
3.事例输出
4.程序模板
5.问题解答提示
6.后续问题和任务
程序模板是完整的、可实际运行的C程序,其中关键的一行或者多行代码已经替换为注释。
请先阅读问题描述,分析事例输出;然后研究模板的代码。
参考问题解答提示,用C代码替换/**/注释。
编译并执行程序,并将输出结果与提供的事例输出进行比较。
然后回答强化练习。
实验目的:
本实验旨在巩固学生对文件概念的理解,增强程序设计能力。
在这个实验中,学生将练习:
•用包含命令将头文件”stdlib.h”包含进来。
•设置带参数的主函数。
•设置文件类型的指针fp。
•if语句判断,若命令行的参数少于2个,则输出"Nofilename.",退出程序。
•用fopen()函数以读方式打开文件,若打不开,则输出"Nosuchfile.",退出程序。
•利用循环语句,若没有读到文件结束EOF,依次从文件中读出字符并显示在屏幕上。
•关闭文件。
在强化练习中,学生将练习:
•设置无参的主函数,显示指定文件。
•利用fgets()函数读取文件中的字符串,完成类似功能。
•利用fgetc()函数和fputc()函数,模拟DOS的copy命令。
•利用fgets()函数和fputs()函数,模拟DOS的copy命令。
问题描述
编写程序,用带参数的主函数接收从命令行中传来的文件,将该文件以读方式打开,然后用fgetc()函数将字符一个个读出,显示在屏幕上。
示例输出
D:
\>pro10_1pro_1.c
#include“stdio.h”
voidmain()
{inta=3,b=4,c;
c=a+b;
printf(“c=%d\n”,c);
}
注:
设有文件pro_1.c,其内容为:
#include“stdio.h”
voidmain()
{inta=3,b=4,c;
c=a+b;
printf(“c=%d\n”,c);
}
程序模板(设此程序的程序名为:
pro10_1.c)
#include"stdio.h"
#include"stdlib.h"
voidmain(______,________)
{/*定义文件类型的指针fp*/
charch;
if(argc<2)
{/*输出"Nofilename."*/
/*退出程序*/
}
if(以读方式打开命令行中待显示的文件argc[1],
若能打开,则使文件指针fp指向该文件的信息区)
{printf("Nosuchfile.");
abort();
}
while((ch=fgetc(fp))!
=EOF)
/*将从文件中读出的字符显示在屏幕上*/
/*关闭文件*/
}
问题解答提示
1.文件类型FILE是在头文件“stdio.h”中说明的。
2.每个打开的文件都对应一个FILE类型的结构体,用于存放文件的信息(文件信息区),可以用FILE定义文件指针变量指向文件的信息区,从而对文件进行操作。
3.主函数的参数有三个,即命令行中参数的个数(argc)、存放各个命令行参数的字符串数组(argv)、存放各个环境变量的字符串数组(env)。
4.对于DOS的type命令,只有两个参数。
若参数个数小于2,则退出程序。
5.若文件打开成功,fopen()返回一个有效的文件指针,否则返回空指针NULL。
6.调用fgetc(fp)函数,依次从文件中读出字符赋给字符变量ch并显示在屏幕上;读到文件结尾时,则结束。
7.文件操作完成后,要关闭文件。
8.如果在实验中碰到任何问题,请向实验老师寻求帮助。
强化练习
1.根据程序模板,设置无参的主函数,使之能显示指定的文件,试编写程序。
2.重新编写程序,利用fgets()函数读取文件中的字符串,完成类似功能。
3.编写程序,利用fgetc()函数和fputc()函数,模拟DOS的copy命令。
4.编写程序,利用fgets()函数和fputs()函数,模拟DOS的copy命令。
实验练习2:
从键盘输入一行字符串,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘文件“test.dat”中保存,然后读出并输出在屏幕上。
试编写程序。
本练习要求在封闭式实验课中在助教或者讲师的指导下完成。
本练习分成6个部分:
1.实验目的
2.问题描述
3.事例输出
4.程序模板
5.问题解答提示
6.后续问题和任务
程序模板是完整的、可实际运行的C程序,其中关键的一行或者多行代码已经替换为注释。
请先阅读问题描述,分析事例输出;然后研究模板的代码。
参考问题解答提示,用C代码替换/**/注释。
编译并执行程序,并将输出结果与提供的事例输出进行比较。
然后回答强化练习。
实验目的:
本实验旨在巩固学生对文件概念的理解,增强程序设计能力。
在这个实验中,学生将练习:
•定义文件类型的指针fp。
•以写方式打开test.dat文件,若打不开,则退出程序。
•从键盘输入一串字符。
•利用循环语句逐个字符进行判断和写入文件。
若该字符是小写字母,则将它转换为大写字母,其余字符不变。
•关闭写文件test.dat。
•以读方式再次打开test.dat。
•从文件中读出一串字符,赋给字符数组str。
•输出字符数组str中的字符串。
•关闭读文件test.dat。
在强化练习中,学生将练习:
•将字符串中的大写字母转换为小写字母,存入文件。
•将字符串中的字符加上数字5后,存入文件jiami.txt。
•将文件jiami.txt中的字符依次读出,减去数字5后,显示在屏幕上。
问题描述
首先以写方式打开文件test.dat,从键盘读入一行字符串,处理该行中的每个字符,若是小写字母转换为大写字母,然后将转换后的字符串写入文件,将文件关闭。
再以读方式打开文件test.dat,从文件中读入一串字符显示在屏幕上。
示例输出
Inputastring:
Iamastudent.
IAMASTUDENT.
程序模板
#include"stdio.h"
#include"stdlib.h"
voidmain()
{FILE*fp;
charstr[100];
inti;
if(以写方式打开文件test.dat,若能打开,则使
文件指针fp指向该文件的信息区)
{printf("Cannotopenthefile.\n");
/*用exit(0)退出程序*/
}
printf("Inputastring:
");
/*输入一串字符存入字符数组str*/
for(i=0;str[i]&&i<100;i++)
{if(str[i]是否是小写字母)
/*将str[i]转换成大写字母*/
/*将str[i]写入文件*/
}
fclose(fp);
/*以读方式打开文件test.dat,若能打开,
则使文件指针fp指向该文件的信息区*/
fgets(str,100,fp);
printf("%s\n",str);
fclose(fp);
}
问题解答提示
1.exit(0)是带参数退出程序,该函数是在头文件"stdio.h"中定义的。
2.打开文件函数fopen()中的第二个参数是文件打开方式。
是"w"时是写方式,"r"时是读方式。
3.用gets()函数输入的字符串中,可以包含空格字符。
4.用逻辑表达式"str[i]>='a'&&str[i]<='z'"可以判断str[i]是否是小写字母。
5.大写字母比小写字母小32('a'-'A'),所以将小写字母转换成大写字母只要将该字母减32即可。
6.从文件中读取字符串,用fgets()函数。
7.如果在实验中碰到任何问题,请向实验老师寻求帮助。
强化练习
1.根据程序模板,将字符串中的大写字母转换为小写字母,并存入文件。
试编写程序。
2.从键盘输入一个字符串,将字符串中的字符加上数字5后,存入文件jiami.txt中。
试编写程序(加密程序)。
3.将文件jiami.txt中的字符依次读出,减去数字5后,显示在屏幕上。
试编写程序(解密程序)。
实验练习3:
从键盘输入3个学生的数据,将它们存入磁盘文件student.dat中,然后再从文件中读出数据,显示在屏幕上。
设学生数据包括学号、姓名、性别、年龄。
试编写程序。
本练习要求在封闭式实验课中在助教或者讲师的指导下完成。
本练习分成6个部分:
1.实验目的
2.问题描述
3.事例输出
4.程序模板
5.问题解答提示
6.后续问题和任务
程序模板是完整的、可实际运行的C程序,其中关键的一行或者多行代码已经替换为注释。
请先阅读问题描述,分析事例输出;然后研究模板的代码。
参考问题解答提示,用C代码替换/**/注释。
编译并执行程序,并将输出结果与提供的事例输出进行比较。
然后回答强化练习。
实验目的:
本实验旨在巩固学生对文件概念的理解,增强程序设计能力。
在这个实验中,学生将练习:
•定义structstudent结构体类型,并同时定义该类型的数组stu和变量out。
•定义FILE类型的指针fp。
•利用循环语句给数组stu的各元素赋值。
•以二进制写方式打开文件student.dat,若打不开,则退出程序。
•利用循环语句,用fwrite()函数将数组stu的各条记录依次写入文件student.dat中。
•以二进制读方式打开文件student.dat。
•利用循环语句,用fread()函数从文件student.dat中依次读出记录存入structstudent类型的变量out中,并显示在屏幕上。
在强化练习中,学生将练习:
•打开数据文件student.dat能看到什么结果,为什么?
•将fwrite()函数换成fprintf()函数,fread()函数换成fscanf()函数,重编程序。
打开数据文件student.dat能看到什么结果?
问题描述
编写程序。
将学生的数据写入结构体数组,以二进制写方式打开数据文件student.dat,用fwrite语句将记录一条条写入文件。
最后用fread语句将记录读入结构体变量out中,然后将out的值显示在屏幕上。
示例输出
Inputstudent1:
0101limingm20
Inputstudent2:
0102wanglif19
Inputstudent3:
0103luminm21
NoNameSexAge
0101limingm20
0102wanglif19
0103luminm21
程序模板
#include"stdio.h"
#include"stdlib.h"
#defineSIZE3
structstudent
{charnum[5];
charname[10];
charsex;
intage;
}stu[SIZE],out;
voidmain()
{FILE*fp;
inti;
for(i=0;i{printf("Inputstudent%d:
",i+1);
/*从键盘输入学生的一组数据*/
}
if(以二进制写方式打开文件student.dat,若能打开,则使
文件指针fp指向该文件的信息区)
{printf("Cannotopenfile.\n");
abort();
}
for(i=0;i/*用fwrite()函数将学生的记录写入文件student.dat中*/
fclose(fp);
fp=fopen("student.dat","rb");
printf("NoNameSexAge\n");
for(i=0;i{/*用fread()函数,从文件student.dat中读取一条记录存入out中*/
printf("%-5s%-10s%c%d\n",out.num,out.name,out.sex,out.age);
}
/*关闭文件*/
}
问题解答提示
1.二进制文件是由一串与内存存放形式相同的字节组成。
它不需要转换就从内存送到文件中存放起来。
2.打开文件函数fopen()中的第二个参数是文件打开方式。
是"wb"时是二进制写方式打开文件,"rb"时是二进制读方式打开文件。
3.fread()函数和fwrite()函数的第一个参数是读取数据暂存区的地址,要用取地址运算符&,如&out、&stu[i]。
4.fread()函数和fwrite()函数的第二个参数是每个数据块(每条记录)的字节数,用sizeof(structstudent)求出。
5.如果在实验中碰到任何问题,请向实验老师寻求帮助。
强化练习
1.在DOS下,用typestudent.dat命令,会看到什么结果?
2.根据程序模板,将fwrite()函数换成fprintf()函数,fread()函数换成fscanf()函数,重新编写程序。
实验练习4:
设有学生数据文件student.dat,编写程序将其中第i个学生的记录输出出来。
本练习要求在封闭式实验课中在助教或者讲师的指导下完成。
本练习分成6个部分:
1.实验目的
2.问题描述
3.事例输出
4.程序模板
5.问题解答提示
6.后续问题和任务
程序模板是完整的、可实际运行的C程序,其中关键的一行或者多行代码已经替换为注释。
请先阅读问题描述,分析事例输出;然后研究模板的代码。
参考问题解答提示,用C代码替换/**/注释。
编译并执行程序,并将输出结果与提供的事例输出进行比较。
然后回答强化练习。
实验目的:
本实验旨在巩固学生对文件概念的理解,增强程序设计能力。
在这个实验中,学生将练习:
••定义structstudent结构体类型,并同时定义该类型变量out。
•定义FILE类型的指针fp。
•以二进制写方式打开文件student.dat,若打不开,则退出程序。
•输入待查找学生的序号。
•用rewind()函数将文件指针fp重新指向文件的开头处。
•用fseek()函数将文件指针定位在带查找的记录上。
•用fread()函数从文件student.dat中读出记录存入structstudent类型的变量out中,并显示在屏幕上。
在强化练习中,学生将练习:
•输出序号为偶数的学生的记录。
•按逆序输出学生的记录。
问题描述
将学生数据文件student.dat以二进制读方式打开,然后将文件指针定位在第i条记录上,用fread语句将记录读出来,显示在屏幕上。
示例输出
请输入学生的序号:
2
0102wangfanf19
程序模板
#include"stdio.h"
#include"stdlib.h"
structstudent
{charnum[5];
charname[10];
charsex;
intage;
}out;
voidmain()
{FILE*fp;
inti;
if((fp=fopen("student.dat","rb"))==NULL)
{printf("Cannotopenfile.\n");
/*退出程序*/
}
printf("请输入学生的序号:
");
scanf("%d",&i);
/*将文件指针重定位至文件的开头处*/
/*将文件指针定位在待查找的记录上*/
fread(&out,sizeof(structstudent),1,fp);
printf("%s%s%c%d\n",out.num,out.name,out.sex,out.age);
/*关闭文件*/
}
问题解答提示
1.若不知文件指针指向何处,用重定位函数,将文件指针fp重新指向文件的开头处。
2.fseek()函数中的第三个参数是移动文件指针时的起始位置。
为0时,表示文件指针在文件的开始处;为1时,表示文件指针在当前文件指针位置;为2时,表示文件指针在文件尾。
3.fseek()函数中的第二个参数是移动到距起始位置为多少条记录的地方,即偏离量。
计算方法是:
(i-1)*sizeof(structstudent)。
第一条记录的偏离量是0,所以要i-1。
4.若偏离量大于0,表示文件指针向文件尾移动;若偏离量小于0,表示文件指针向文件头移动
5.如果在实验中碰到任何问题,请向实验老师寻求帮助。
强化练习
1.重新编写程序,输出序号为偶数的学生的记录。
2.重新编写程序,按逆序输出学生的记录。
10.4综合练习
1.编写程序,将33—126之间的所有字符写入文件chars.txt中。
#include"stdio.h"
#include"stdlib.h"
voidmain()
{FILE*fp;
intch;
if((fp=fopen("chars.txt","w"))==NULL)
{printf("fileopenerror!
\n");
exit(0);
}
for(ch=33;ch<=126;ch++)
fputc(ch,fp);
fclose(fp);
}
2.在磁盘文件上存有10个学生的数据。
要求将第1、3、5、7、9个学生数据输入计算机,并在屏幕上显示出来。
#include"stdio.h"
structstudent
{charname[10];
intnum;
intage;
charsex;
}stud[10];
voidmain()
{inti;
FILE*fp;
if((fp=fopen("stud.dat","rb"))==NULL)
{printf("Cannotopenfile!
\n");
exit(0);
}
for(i=0;i<10;i+=2)
{fseek(fp,i*sizeof(structstudent),0);
fread(&stud[i],sizeof(structstudent),1,fp);
printf("%s%d%d%c\n",stud[i].name,
stud[i].num,stud[i].age,stud[i].sex);
}
fclose(fp);
}