第12章文件

Download Report

Transcript 第12章文件

第12章 文件
导言
文件是程序设计中的一个重要概念。本章
将讨论C程序的文件如何使用,并介绍文件读
写函数的功能及各个参数的含义。
通过本章学习,可以清楚的认识C程序数
据处理的方式,程序处理的数据从何而来,
得到的结果送到哪里去?如何使用读写函数
解决这方面的问题。
本章要点
• 文件的概念
• 文件的打开与关闭
• 文件读写函数的应用
12.1 文件概述
•
文件是指有组织的存储在外部介质(内
存以外的存储介质)上数据的集合。每一个
文件必须有一个文件名,一个文件名由文
件路径、文件名主干和文件名扩展名三部
分组成。计算机系统都包括文件系统,按
文件名对文件进行组织和存取管理。
12.1 文件概述
在C语言程序中对文件名的应用中,要注意:
1. 用两个反斜杠(\\)作为目录、子目录、文件
之间的分隔。如操作系统中的文件:
d:\exam\test.txt
表明文件test.txt存储在d盘的exam文件夹中。在
C语言程序使用中要写成如下形式:
d:\\exam\\test.txt
2. 文件名的命名,必须符合C语言标识符的命名
规则。
12.1 文件概述
在外部介质上写(存储)数据,首先必
须建立一个文件,然后向它写入数据。要
想获取保存在外部介质上的数据,首先必
须找到指定的文件,然后再读取该文件中
数据。
文件的分类
按数据的组织形式:
ASCII文件(文本文件):每一个字节放一个ASCII代码
二进制文件:把内存中的数据按其在内存中的存储形
式原样输出到磁盘上存放.
例:整数10000在内存中的存储形式以及分别按ASCII
码形式和二进制形式输出如下图所示:
文件的分类
文件的处理方法:
缓冲文件系统:系统自动地在内存区为每一个正在
使用的文件开辟一个缓冲区。用缓冲文件系统进行的输
入输出又称为高级磁盘输入输出。
非缓冲文件系统:系统不自动开辟确定大小的缓
冲区,而由程序为每个文件设定缓冲区。用非缓冲文件
系统进行的输入输出又称为低级输入输出系统。
ANSI C只采用缓冲文件系统
12.2 文件的使用
在C语言中,对文件的读写都是调用库函
数实现的,没有直接用于输入输出的关键字。
ANSI C定义了标准输入输出函数,进行文件
的读写操作。标准输入输出函数是通过操作
FILE类型(stdio.h中定义的结构类型)的指
针(称之为文件指针)实现对文件的存取。
12.2 文件的使用
利用标准输入输出函数进行文件处理的
一般步骤为:
1. 首先打开文件,建立文件指针或文件描述
符与外部文件的联系。
2. 通过文件指针或文件描述符进行读/写操
作。
3. 关闭文件,切断文件指针或文件描述符与
外部文件的联系。
文件指针
• 在缓冲文件系统中定义了一个“文件指
针”,它是由系统定义的结构体类型,并
取名为FILE,所以也称FILE类型指针。
• 因这个文件类型在stdio.h文件中定义,所以
首先要包含stdio.h文件,然后才能对文件进
行操作。通常用FILE类型来定义指针变量,
通过它来访问结构体变量。
文件的声明
定义文件类型指针变量的一般格式为:
FILE *变量名;
如:
FILE *mp,*np,*tp;
表示定义了mp、np、tp三个指针变量,都是
指向FILE类型结构体数据的指针变量。
文件的打开
1.fopen()函数
调用形式:
fopen(”文件名”,”文件操作方式”);
函数功能:以指定的”文件操作方式”打开”文件名”
所指向的文件。
例如:打开d盘exam文件夹中的test.txt文件
fopen(”d:\\exam\\test.txt”,”r”);
说明:
(1)文件名要把文件的相关信息准确描述,
即包含文件路径、文件名称和文件扩展名。
(2)要理解每种文件操作方式的含义。如
“r”打开一个文件时,该文件必须已经存在,
且只能从该文件读取数据。
fopen()函数返回值:
当fopen()函数执行成功,返回一个FILE类
型的指针值;当执行失败(不能实现打开
文件任务)时,返回一个NULL值。不能打
开文件的原因可能是磁盘故障、磁盘已满
无法建立文件、用“r”方式打开文件不存在
等。
在使用的过程中,为了检测文件是否正
常打开,通常会利用其返回值,使用下面方
法打开文件。
FILE *mp;
mp=fopen(”d:\\exam\\test.txt”,”r”);
if(mp= =NULL)
{ printf(“Can not open this file!\n”);
exit(0);/* 关闭所有文件,终止执行的程序,返
回操作系统 */
}
例:某个班10名同学的高等数学成绩data.txt
存储在D盘下文件夹data中的grade文件夹中,
请将data.txt打开以便使用。
FILE *fp;
fp = fopen("d:\\data\\grade\\data.txt","r");
if(fp==NULL)
{
printf("Can not open this file!\n");
exit(0);
}
例:在D盘的data文件中创建result.dat文件,
以便存储数据。
FILE *np;
np = fopen("d:\\data\\result.txt","w");
if(np==NULL)
{
printf("Can not create this file!\n");
exit(0);
}
2.fclose()函数
调用形式:
fclose(文件指针变量);
函数功能:关闭文件指针变量所指向的文件,
同时自动释放分配给此文件的缓冲区。
函数返回值:如果执行关闭文件操作成功,
返回值为0;关闭失败,则返回值为EOF。
例:关闭已打开的文件d:\exam\test.txt
FILE *mp;
mp=fopen(“d:\\exam\\test.txt”,“r”);
...
fclose(mp);
关闭mp所指向的文件,同时mp不在指向该文
件。
12.3 文件的读写操作
打开文件的目的就是要向文件写或读其
中的数据。根据写/读内容形式的不同,分别
定义了不同的函数进行操作。fprintf()和
fscanf()函数是进行格式化操作。
文件的读操作
fscanf()函数
调用形式:
fscanf(文件指针,格式字符串,输入列表项);
函数功能:按照格式字符串的格式,将文件指针
所指向的文件中的数据赋值给输入列表项。
函数返回值:实际读取的值的个数,如果一个值
也没有读取返回EOF。
fscanf()函数与scanf()函数都是输入函数,
只不过获取数据的位置不同,scanf()函数是从键
盘获取数据,而fscanf()函数是从磁盘文件获取
数据。
例:将具有10个数据的data.txt数据显示在屏
幕上。
int array[10];
for(int i=0;i<10;i++)
{
fscanf(fp,”%d”,array+i);
printf(“%d\n”,array[i]);
}
文件的写操作
fprintf()函数
调用形式:
fprintf(文件指针,格式字符串,输出列表项);
函数功能:按照格式字符串的格式,将输出列表
项中的内容输出到文件指针所指向的文件。
fprintf()函数与printf()函数都是输出函数,
只不过输出的位置不同,printf()函数是将数据输
出到显示器,而fprintf()函数是将数据输出到磁盘
文件。
例:将0到4这5个数据写入文件result.dat中。
for (int i=0;i<5;i++)
fprintf(fp,”%d\n”,i);
12.4 文件程序举例
• 某个班10名同学的高等数学成绩data.txt存
在D盘下的文件夹data中的grade文件夹中,
将不及格的成绩输入到result.dat中。
如果文件未指明数据长度,可使用feof()函数
进行判断。
feof()函数调用形式为:
feof(文件类型指针);
参数:文件类型指针是一个FILE类型的数据文件指
针变量。
功能:判断文件指针是否指向文件尾。
返回值:如果文件指针指向文件尾部,返回值为1;
如果文件指针未指向文件尾部,返回值为0。
例:grade.dat中存储有某科目学生的成
绩,统计不及格率,并将不及格的成绩
输入nopass.dat中。
文件操作步骤总结
文件的打开 fopen()
文件的读写操作
fscanf()
fprintf()
文件的关闭
fclose()