版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
文件8.1文件概述8.2文件的打开与关闭8.3文件的读/写本章小结
本章要点
本章主要介绍文件的概念及其相关操作等内容,其中包括用文件指针进行文件打开、关闭和读写操作等。通过本章学习,要求了解磁盘文件的概念和用途;掌握文件指针的概念和文件变量的定义方法;深刻理解文件的读、写等基本操作的实现;熟悉文件的打开、关闭、读、写等函数的调用形式;掌握文件操作在程序设计中的应用方法。
8.1文件概述
8.1.1文件的概念所谓“文件”是指一组相关数据的有序集合。这个数据集有一个名称,叫做文件名。在前面的章节中我们已经多次使用了文件,例如源程序文件(.c)、目标文件(.obj)、可执行文件(.exe)等。它们通常驻留在外部介质(如磁盘)上,在使用时才调入内存。下面我们从不同的角度对文件做不同的分类。
1.从用户使用的角度看
文件可分为普通文件和设备文件两种。
普通文件是指驻留在磁盘或其他外部介质上的一个有序数据集,可以是源文件、目标文件、可执行程序,也可以是一组待输入处理的原始数据,或者是一组输出的结果。对于源文件、目标文件、可执行程序,可以称做程序文件;对于输入输出数据,可称做数据文件。
设备文件是指与主机相连的各种外部设备,如显示器、打印机、键盘等。在操作系统中,把外部设备也看做是一个文件来进行管理,把它们的输入和输出等同于对磁盘文件的读和写。通常把显示器定义为标准输出文件,一般情况下在屏幕上显示有关信息就是向标准输出文件输出,如前面经常使用的printf()、putchar()函数就是这类输出。键盘通常被指定为标准的输入文件,从键盘上输入就意味着从标准输入文件上输入数据,scanf()、getchar()函数就属于这类输入。C语言系统定义了5个标准设备文件可供使用,如表8-1所示。
2.从文件编码和数据的组织方式来看
文件可分为ASCII码文件和二进制码文件。
ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符占一个字节,每个字节中存放相应字符的ASCII码。内存中的数据存储时需要转换为ASCII码。
二进制文件是按二进制的编码方式来存放文件的,内存中的数据存储时不需要进行数据转换,存储介质上保存的数据采用与内存数据一致的表示形式存储。
例如,int型数据2008的存储形式如表8-2所示。
8.1.2文件指针
在C语言程序中,无论是一般磁盘文件还是设备文件,都可以通过文件结构类型的数据集合进行输入输出操作。文件结构是由系统定义的,取名为FILE。FILE结构是用typedef语句定义出的一种类型,并且这个结构实现已经被定义在stdio.h头文件中,使用文件程序都需要包含“#include<stdio.h>”。
C语言中,用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作。定义说明文件指针的一般形式为:
FILE*指针变量标识符
其中,FILE必须大写,它实际上是在stdio.h头文件中系统定义的一个新数据类型,包含文件名、文件位置等信息,可理解为一个包括了文件管理有关信息的数据结构。在编写程序时不必关心FILE具体结构,但在打开文件时必须先定义一个文件指针。
例如:
FILE*fp;
其中,fp是指向FILE结构的指针变量,习惯上称为文件指针。
8.2文件的打开与关闭
任何一个文件在使用之前都要进行打开操作,使用之后关闭操作,这是因为操作系统对于同时打开的文件数目是有限制的。DOS操作系统中,可以在DEVICE.SYS中定义允许同时打开的文件数n(用files=n定义)。其中n为可同时打开的文件数,一般n<=20。因此在使用文件前应先打开文件,才可对其中的信息进行存取。文件用完之后需要关闭,否则将会出现一些意想不到的错误。所以,在对磁盘文件进行操作时,一定要养成“先打开,后读写操作,最后关闭”的习惯。
8.2.1文件的打开操作
C语言用fopen()函数来实现文件的打开。fopen()函数的调用方式一般为:
FILE*fp;
fp=fopen(文件名,文件使用方式);
fopen()函数中第一个形式参数可以包含路径和文件名两部分。
例如:
fp=fopen("c:\\tc\\in.txt","r");
第二个形式参数表示打开文件的方式。关于文件打开方式的基本字符,其含义如表8-3所示。
如果成功打开了一个文件,则fopen()函数返回文件指针,否则返回空指针(NULL),由此可判断文件打开是否成功。
例如:
if((fp=fopen("c:\\tc\\int.txt","r"))==NULL)
{printf("Cannotopenthisfile.\n");exit(0);}
如果屏幕上显示“Cannotopenthisfile.”,则表明打开文件出错。出错的常见原因是:用“r”方式打开一个不存在的文件。exit函数的作用是关闭所有文件,终止正在调用的过程。待程序员检查出错误,修改后再运行。
说明:
(1)用“w”方式打开文件时,只能从内存向该文件输出(写)数据,而不能从文件向内存输入数据。如果该文件原来不存在,则打开时按指定文件名建立一个新文件。如果原来的文件已经存在,则打开时将文件删空,然后重新建立一个新文件。
(2)用“a”方式打开文件时,向文件的尾部添加新数据,文件中原来的数据保留,但要求文件必须存在,否则会返回出错信息。打开文件时,文件的位置指针在文件末尾。
(3)用“r+”、“w+”、“a+”方式打开文件时,既可以输入也可以输出,不过三种方式是有区别的:“r+”方式要求文件必须存在;“w+”方式要求建立新文件后进行读写;“a+”方式要求保留文件原有的数据,进行追加或读操作。
(4)在用文本文件向计算机输入时,应将回车和换行两个字符转换为一个换行符;在输出时,应将换行符转换为回车和换行两个字符。在用二进制文件时,不需进行这种转换,因为在内存中的数据形式与输出到外部文件中的数据形式完全一致,一一对应。
选择好打开的方式,在对文件进行操作时必须遵守打开方式的约定,否则会出错。例如以“r”方式打开,却要向文件中写入数据,会导致程序出错。另外要注意对原有文件的保护,如果原有数据需要保留,就不能用“w”或“w+”的方式打开,否则将丢失原有的数据。
8.2.2文件的关闭操作
文件在使用完后应该及时关闭它,以防止再被误用。“关闭”就是释放文件指针。释放后的文件指针变量不再指向该文件,为自由的文件指针。这种方式可以避免文件中的数据丢失。释放指针后不能再通过该指针对原对应的文件进行读写操作,除非再次用该指针变量打开该文件。
可用fclose()函数关闭文件。fclose()函数调用的一般形式为:
fclose(文件指针);
例如:
fclose(fp);
用fopen()函数打开文件时所带回的指针赋给了fp,现把该文件关闭。如果文件关闭成功,则fclose()函数返回值为0;如果关闭出错,则返回值为EOF(-1)。这可以用ferror()函数来测试,当然也可以根据函数的返回值自己编程判断文件是否关闭成功。
8.3文件的读/写
文件的读和写是最常用的文件操作,C语言提供了多种文件读/写函数:★文件字符读/写函数:fgetc()和fputc();★文件字符串读/写函数:fgets()和fputs();★文件格式化读/写函数:fscanf()和fprintf()。
8.3.1文件字符读/写
本节所讲的文件读写函数均是指顺序读写,即读写了一条信息后,文件内部指针自动加1。
1.字符输入函数fgetc()
fgetc()函数用来从指定文件读入一个字符,该文件必须是以读或读写方式打开的。
fgetc()函数的调用形式为:
字符变量=fgetc(文件指针);
例如,从fp指向的文件中读取一个字符并赋给字符变量ch,则可写成:ch=fgetc(fp);
说明:
(1) fgetc()为字符读函数,因此之前必须以读或读写方式打开文件。
(2)若在执行fgetc()读字符时遇到文件结束符或出错,则函数返回一个文件结束标志EOF(-1)。若形参fp为标准输入文件指针stdin,则读文件字符函数fgetc(stdin)与终端输入函数getchar()具有完全相同的功能。
【例8-1】在屏幕上显示文本文件readme.txt的内容。
2.字符输出函数fputc()
fputc()函数用来把一个字符写入到磁盘文件中。其一般形式为:
fputc(字符变量,文件指针);
同样,fputc(ch,stdout)的作用是将字符变量ch的值在显示器上输出,与函数putchar(ch)的功能完全相同。
【例8-2】从键盘上输入一行字符,写入“test.txt”文件中。
【例8-3】编程完成将文本文件readme.txt复制到result.txt中。
8.3.2文件字符串读/写
1.读文件字符串函数fgets( )
fgets()函数用来从指定文件读入一个字符串,该文件必须是以读或读写方式打开的。fgets()函数的调用形式为:
fgets(str,n,fp);
其功能为从fp指向的文件读取至多n-1个字符(n用来指定字符数),并把它们放到字符数组str中。在读入之后,自动向字符串未尾加上串结束标志'\0'。如果读成功,则返回str数组首地址;如果失败,则返回一个空指针。
读取操作遇到以下情况结束:
(1)已经读取了n-1个字符;
(2)在读出n-1个字符之前,当前读取到的字符为回车符或者文件未尾。
2.写文件字符串函数fputs( )
fputs()函数用来把一个字符串写入到磁盘文件上。其一般形式为:
fputs(str,fp);
其功能为把字符串str写入到fp所指向的文件,但字符串结束符'\0'不写入。
【例8-4】利用字符串读写函数编程实现例8-3的功能,即将readme.txt复制到result.txt中;同时,将readme.txt文件内容显示在屏幕上。
8.3.3文件格式化读/写
fscanf()函数、fprintf()函数与前面章节介绍的scanf()函数和printf()函数的功能相似,都是格式化读写函数。它们的区别是scanf()函数和printf()函数读写的对象是键盘和显示器,而fprintf()函数和fscanf()函数读写的对象是磁盘文件。
1.格式化输入函数fscanf( )
fscanf()函数调用的格式为:
fscanf(fp,格式控制串,输入列表);
其中,fp是指向要读取文件的文件型指针,格式控制串、输入列表同scanf()函数。
其功能是从fp指向的文件中,按格式控制串中的控制符读取相应数据赋给输入列表中对应的变量。
例如:
fscanf(fp,"%d,%f",&a,&f);
该语句完成从指定的磁盘文件中读取ASCII字符,并按"%d"和"%f"格式转换成二进制形式的数据给变量a,f。
2.格式化输出函数fprintf()
fprintf()函数调用的格式为:
fprintf(fp,格式控制串,输出列表);
其中,fp是指向要写入文件的文件型指针,格式控制串、输出列表同printf()函数。其功能是将输出列表中的各个变量或常量,依次按格式控制串中的控制符说明的格式写入fp指向的文件中。
【例8-5】格式化函数示例。
【例8-6】从键盘输入两个学生的学号、姓名和成绩数据,写入一个文件中,再读出这两个学生的数据并显示在屏幕上。
8.3.4其他相关函数
1.文件结束判断函数feof( )
feof()函数的调用格式为:
feof(文件指针);
feof()函数检测文件位置指针是否到达了文件结尾,若是,则返回一个非0值,否则返回0。这个函数对二进制文件操作特别有用,因为在二进制文件中,文件结尾标志EOF也是一个合法的二进制数,只通过简单地检查读入字符的值来判断文件是否结束是不行的,这样可能会造成文件未结尾而被认为结尾。所以,在此必须有feof()函数。
2.rewind()函数
rewind()函数的调用形式为:
rewind(文件指针);
其功能是使文件内部的位置指针指到文件的开头,此函数没有返回值。
3.fseek()函数
fseek()函数的调用形式为:
fseek(fp,offset,fromwhere);
其中:
fp是文件指针。
offset为文件位置指针的位移量,指以起始位置为基准值向前移动的字节数。它是一个长整型量,如果它的值为负数,则表示向后移,即向文件头方向移动。
fromwhere表示文件位置指针起始计算位置。其位置可取3种值:文件首部、当前位置和文件尾部,实际表示时分别对应值0、1、2,或常量SEEK_SET、SEEK_CUR、SEEK_END。
4.ftell()函数
ftell()函数的作用是得到文件中位置指针的当前位置。如果ftell()函数返回值为-1L,则表示出错。例如:
if(ftell(fp)==-1L)
printf("error\n");
5.文件读写错误检测函数ferror()
在调用各种输入输出函数如fputc()、fgetc()、fread()、fwrite
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 康复护理中的运动疗法应用
- 企业内部管理系统需求分析报告
- 粉煤灰供应链数字化管理实践案例
- 小学教育科研工作规划与实施方案
- 水利工程施工技术规范培训材料
- 老年人日常生活能力评估工具介绍
- 质量控制抽检清单抽样方案及评价标准
- 班级主题班会活动策划书
- 河堤防护工程质量评定表格标准
- 市政工程项目施工质量验收标准
- GB 25576-2020食品安全国家标准食品添加剂二氧化硅
- 跨文化世界语言emoji
- 心衰的中医药治疗陈良金课件
- 新湘科版科学五年级上册全册课件(精品PPT)
- 数据挖掘方法与应用全套教学课件
- GB∕T 17466.1-2019 家用和类似用途固定式电气装置的电器附件安装盒和外壳 第1部分:通用要求
- 风力发电技术--课件第7章-风电场SCADA系统
- 安全用电、用电安全培训ppt课件
- Q∕GDW 12158-2021 国家电网有限公司重大活动电力安全保障工作规范
- 湘潭市建设工程质量安全监督规范化工作实施细则
- 发动机盖铰链的设计开发
评论
0/150
提交评论