中央电大C语言A课程辅导8.docx
- 文档编号:3842755
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:13
- 大小:22.88KB
中央电大C语言A课程辅导8.docx
《中央电大C语言A课程辅导8.docx》由会员分享,可在线阅读,更多相关《中央电大C语言A课程辅导8.docx(13页珍藏版)》请在冰豆网上搜索。
中央电大C语言A课程辅导8
C语言程序设计A课程辅导(8)
---第8章文件
主要内容:
一、文件的概念
二、文件的打开和关闭
三、文本文件的访问操作
四、二进制文件的访问操作
五、课程总复习
一、文件的概念
●文件是计算机外部设备中一个被命名的信息单位
Ø标准输入输出(I/O)设备文件:
如stdin和stdout分别表示标准输入设备键盘和标准输出设备显示器。
这两个文件流标识符在stdio.h系统头文件中有定义,类型为FILE*,其中文件类型(FILE)也在stdio.h中定义。
我们可以随时从stdin中读出(即从键盘输入到内存)信息,也可以随时向stdout中写入(从内存输出到文件)信息。
Ø外存储设备中保存的文件:
由用户命名,并规定访问文件的方式。
如只允许向其写入信息的输出方式的文件,只允许从已有文件中读出信息的输入方式的文件,又允许写入又允许读出的输入和输出方式的文件等。
●文件的3种基本的访问方式
Ø输入方式:
从文件读出数据到内存变量(数组)中保存。
Ø输出方式:
把内存变量(数组)的内容送入到文件中保存。
Ø既输入又输出方式:
对于同一个文件,可以既进行输入又进行输出。
●文件名
给需要使用的数据文件所起的名字,它包括文件主名和扩展名两部分。
符合命名规定的任何标识符都可以作为主名,如可用gongzi作为工资文件的主名。
扩展名由1-3个字符所构成,如可用txt作为一个扩展名。
在一个文件名中可以省略扩展名。
若带有扩展名,则用句点与主名分开。
如works.ran、工资.bin等。
●文件类型和文件流
在C语言系统中,系统预定义了一种文件类型,文件类型标识符为FILE,当需要使用一个数据文件时,必须根据该文件名和访问方式返回一个具有FILE类型的指针值,接着把这个值保存到具有FILE*类型的指针变量中,以后就用这个指针变量(文件流)代替所对应的文件,完成对文件的操作。
我们前面提到的stdin和stdout分别是系统定义的标准输入和输出文件流。
●文件结束符(EOF)
在每个数据文件的结尾都利用一个字节保存一个文件结束标记(-1),在stdio.h中,把-1定义为符号常量EOF。
●文件长度
文件中保存数据所占有的存储字节数。
当一个文件用来保存记录结构的数据时,有时也把保存的记录个数称为文件长度,此时的文件字节长度等于记录个数乘以记录结构类型的长度。
●数据文件分类
C语句文件按存储信息方式的不同可分为字符文件和字节文件两种。
字符文件又称文本文件或ASCII码文件。
字节文件又称二进制文件或内部格式文件。
字符文件:
文件中保存的字符串信息和数值信息都采用字符的ASCII码的形式。
当然对于汉字信息采用2字节的汉字区位码。
如保存常数23时,对应保存的ASCII码为50和51。
字节文件:
文件中保存的字符串信息仍采用字符的ASCII码的形式,而保存的数值信息则采用其内部格式。
如保存常数23时,因为它是一个int类型的常数,须占用4个字节,对应保存的二进制数为00010111,前面还有3个字节的24个0。
●文件操作函数
包括打开文件、关闭文件、读取数据、写入数据、移动文件指针位置等,它们的函数原型都保存在系统头文件stdio.h中,调用这些函数时必须通过#include命令包含此头文件。
二、文件的打开和关闭
1.打开数据文件
要访问一个文件,首先要按照一定的方式打开一个文件,并使之与一个文件流相联系,然后才能进行存取数据的操作。
当对一个文件的处理操作结束后,就把它关闭掉。
打开一个文件,需要调用C函数库中的fopen()函数,得到相对应的文件流。
该函数的原型为:
FILE*fopen(constchar*fname,constchar*mode);
fname参数:
用于指向要打开文件的文件名字符串,该字符串内可以带有盘符和路径名,若省略盘符和路径名则隐含为当前盘和当前路径,即保存当前程序文件的磁盘和路径,
mode参数:
用于指定打开文件的方式,它也是以字符串的形式给出的,mode是指向该字符串的指针。
如果调用该函数成功,则返回一个文件指针,即文件名为fname、打开方式的mode所对应的文件流,以后就利用它操作文件。
如果调用该函数失败,则返回空指针(NULL),表明没有打开指定的文件,不能进行访问操作。
2.打开数据文件的方式
打开数据文件的方式有以下用字符串表示的12中不同方式:
"r"//打开一个用于输入的文本文件,若文件不存在则打开失败
"w"//打开一个用于输出的文本文件,存在清空,不存在则建立
"a"//打开一个用于向尾部追加输出的文本文件,不存在则建立
"rb"//打开一个用于输入的二进制文件,若文件不存在则打开失败
"wb"//打开一个用于输出的二进制文件,存在清空,不存在则建立
"ab"//打开一个用于向尾部追加输出的二进制文件,不存在则建立
"r+"//打开一个用于读/写操作的文本文件,不存在则打开失败
"w+"//打开一个用于读/写操作的文本文件,不存在则建立
"a+"//打开一个用于读/追加写操作的文本文件,不存在则建立
"rb+"//打开一个用于读/写操作的二进制文件,不存在则打开失败
"wb+"//打开一个用于读/写操作的二进制文件,不存在则建立
"ab+"//打开一个用于读/追加写操作的二进制文件,不存在则建立
总之:
r(read)为读、w(write)为写、b(binary)为二进制、+为读/写
3.打开数据文件举例
(1)FILE*fp1;//定义一个文件指针变量fp1
fp1=fopen("xxk1.dat","w");//以只写方式打开当前路径和目录中
//的本文文件"xxk1.dat",返回的文件流赋给文件指针变量fp1
(2)FILE*fp2=fopen("d:
\\C语言练习\\wr.dat","r");//以只读方式
//打开指定目录内的文本文件"wr.dat",返回的文件流赋给fp2
(3)FILE*fp3=fopen("xxk2.ran","wb+");//为同时能够进行读/写
//和二进制操作方式而打开当前目录中的"xxk2.ran"文件,
//返回的文件流赋给文件指针变量fp3
4.数据文件的关闭
关闭一个文件,需要调用C函数库中的fclose()函数,该函数的原型为:
intfclose(FILE*fp);
如果fp所对应的文件关闭成功则返回0,否则返回-1(EOF)表示失败。
若要关闭已经打开的fp1文件流所对应的"xxk1.dat"文件,则调用:
fclose(fp1);
打开一个文件并处理结束后,最好使用fclose()函数调用关闭它,这样才能够保证临时存储在文件缓冲区的内容全部写入到外存的文件中。
三、文本文件的访问操作
1.向文本文件输出数据
调用在stdio.h头文件中声明的fputc()函数或fputs()函数。
这两个函数的原型为:
intfputc(intch,FILE*stream);//向文件写入一个字符
intfputs(constchar*str,FILE*stream);//向文件写入一个字符串
fputc函数在操作成功时返回原字符,否则返回-1。
fputs函数在操作成功时返回0,否则返回-1。
应用举例
例1向d盘xxk目录下的wr1.dat文件依次输出26个小写英文字母。
分析:
若d盘上没有xxk目录,则要首先建立此目录,然后才能够编写C程序使用此目录建立文件。
在程序的主函数中,首先要根据文件名和访问方式打开此文件,得到对应的文件流,接着依次向其写入26个小写英文字母,最后关闭该文件。
此题的参考程序如下:
#include
#include
voidmain(void)
{
inti;
FILE*f1;//定义文件指针以便保存文件流
f1=fopen("d:
\\xxk\\wr1.dat","w");//以写文本方式打开返回文件流
if(f1==NULL){//当f1对应的文件不存在则退出运行
printf("不能够打开文件!
\n");
exit
(1);
}
for(i=0;i<26;i++)
fputc('a'+i,f1);//向f1文件流输出每个字母
fclose(f1);//关闭f1所对应的文件
}
通过使用操作系统提供的记事本窗口可以查看该文件的内容。
例2把从键盘上输入的若干行文本字符原原本本地存入到d盘xxk目录下的wr2.dat文件中,直到从键盘上输入一空行(即只按下回车键)为止。
分析:
此程序的主函数同样包括定义文件流、打开文件、接收键盘输入和写文件、关闭文件等操作。
#include
#include
#include
voidmain(void)
{
charstr[80];//定义一个字符数组,保存输入的一行字符
FILE*f2;//定义文件指针对象,用来保存一个文件流
f2=fopen("d:
\\xxk\\wr2.dat","w");//以写方式访问文件
if(!
f2){//当f2打开失败时退出运行
printf("CannotopenFile.\n");
exit
(1);
}
printf("在下面输入若干行文本建立文本文件:
\n");
while
(1){//执行while循环
gets(str);//用str保存从键盘上输入的一行字符
strcat(str,"\n");//在字符串的末尾添加一个换行符
if(*str=='\n')break;//若输入的是空串则离开循环
fputs(str,f2);//把str所指向的字符串写入到f2文件
}
fclose(f2);//关闭f2所对应的文件
}
2.从文本文件输入数据
调用在stdio.h头文件中声明的fgetc()函数或fgets()函数。
这两个函数的原型为:
intfgetc(FILE*stream);
char*fgets(char*str,intlength,FILE*stream);
fgetc函数从文件流中的当前字节位置读出一个字符并返回。
若读到文件结束标记则返回-1。
fputs函数从文件流中的当前字节位置起读出一行字符(要小于length长度)并保存到str字符数组空间,同时返回str值。
若没有读到任何内容则返回NULL。
应用举例
例3从上面例1所建立的“d:
\xxk\wr1.dat”文件中输入全部数据并依次显示到屏幕上。
分析:
该文件保存着26个小写英文字符,以读方式打开该文件后,文件当前访问位置是文件开始位置,即第1个字节的位置,每次读出一个字节内容(字符)后,当前访问位置自动后移,接着可以读取下一个字符。
程序如下:
#include
#include
voidmain(void)
{
charch;
FILE*f3=fopen("d:
\\xxk\\wr1.dat","r");//得到输入文件流
if(!
f3){//当f3打开失败时退出程序运行
printf("d:
\\xxk\\wr1.datfilenotopen!
\n");
exit
(1);
}
ch=fgetc(f3);//从文件开始处读出一个字符
while(ch!
=EOF){//ch不等于文件结束符时则循环
printf("%c",ch);//向屏幕窗口输出ch所保存的字符
ch=fgetc(f3);//继续从文件读出一个字符
}
printf("\n");
fclose(f3);//关闭f3所对应的文件
}
该程序运行结果如下:
abcdefghijklmnopqrstuvwxyz
例4从上面例2所建立的“d:
\xxk\wr2.dat”文件中按行读出全部数据,并把它们依次显示到屏幕上,同时统计出文件内容中的行数。
分析:
首先以读方式打开文件返回文件流,接着从文件头开始依次读出每行字符串并显示输出和计数,最后关闭文件。
#include
#include
voidmain(void)
{
inti=0;//定义i用来统计行数
charstr[80];//定义str数组用来保存一行字符串
FILE*f4=fopen("d:
\\xxk\\wr2.dat","r");//得到对应的文件流
if(!
f4){printf("文件没有打开!
\n");exit
(1);}
while(!
feof(f4))//文件未结束时执行循环
char*p=fgets(str,80,f4);//读出一行字符串到str字符数组
if(!
p)break;//若从文件中没有读到内容则退出
printf("%s",str);//向屏幕输出str所指向的字符串
i++;//行数增1
}
printf("文本文件中的行数为:
%d\n",i);
fclose(f4);//关闭f4所对应的文件
}
四、二进制文件的访问操作
●读出和写入信息的函数
对二进制文件是按固定字节数进行信息读写访问操作的。
调用在stdio.h头文件中声明的fread()函数能够从二进制文件中读出固定字节数的信息,调用fwrite()函数能够向二进制文件中写入固定字节数信息。
这两个函数的原型为:
unsignedintfread(void*buffer,unsignedintnum,
unsignedintcount,FILE*stream);
unsignedintfwrite(constvoid*buffer,unsignedintnum,
unsignedintcount,FILE*stream);
参数说明:
stream参数给出要进行操作的二进制文件流,num和count参数分别表示待读写的信息块中一种数据类型的长度和个数,它们之积为信息块的字节数,buffer参数所指向的存储空间是信息在内存中的保存地点。
函数功能:
调用fread函数是从stream所表示的文件中当前字节位置读出num*count个字节的信息并保存到由buffer所指向的存储空间中。
调用fwrite函数是把从buffer所指向的存储空间中的num*count个字节的信息写入到由stream所表示的文件中,从当前字节位置起向后存放。
●移动文件指针位置(当前待读写的字节位置)
在stdio.h头文件中还提供有移动文件指针位置的函数:
intfseek(FILE*stream,longintnumintorigin);
功能:
利用该函数可以把文件指针位置移动到整个文件中的任何字节位置。
随时从这个位置起读写信息。
参数说明:
stream参数给出要进行操作的文件流。
origin参数必须是三个符号常量SEEK_SET、SEEK_CUR或SEEK_END之一。
它们在stdio.h头文件中定义。
SEEK_SET表示文件开始位置,即第1个字节位置;SEEK_END表示文件结尾位置,即保存文件结束标记的位置;SEEK_CUR表示当前的文件指针位置。
num参数给出移动文件位置指针的位移量,为正数时则表示从origin所给的参考点向后移动num个字节,为负数时表示向前移动num个字节,移动后的位置就是当前的文件指针位置。
调用该函数时,若文件位置指针移动成功,则返回0,否则返回非0值。
●应用举例
例1编一程序,首先利用48、62、25、73、66、80、78、54、36、47等10个整数初始化一个整型数组a[10],接着把a中每个元素的值依次写入到二进制文件“d:
\xxk\data.bin”中,然后再对数组a进行升序排序,把排序结果再一次写入到上述二进制文件中。
分析:
首先以二进制写方式打开给定文件,接着把数组a[10]中的数据写入到文件中,再接着对数组a[10]进行升序排列,最后再把数组a[10]中的数据写入到文件中。
对数组a[10]进行升序排列可以单独编写出函数定义。
程序如下:
#include
#include
inta[10]={48,62,25,73,66,80,78,54,36,47};//定义并初始化数组
voidSeleteSort(inta[],intn)//对数组a[10]进行升序排序
{//采用选择排序方法
inti,j,k,x;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中央电大 语言 课程 辅导