第十三章 文 件任课老师:彭金莲返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作本章要求
1、文件中数据的组织形式:文本文件、二进制文件。
2,打开文件的含义,为什么要关闭文件?
3、缓冲文件操作函数的使用。
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作第十三章 文 件
13.1 C文件概述
13.2 文件类型指针
13.3 文件的打开与关闭
13.4 文件的读写
13.5 文件的定位
13.6 文件的检测返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作
13.1 C文件概述
一、文件的概念
1、“文件 (file)”,是记录在介质上的数据的集合,以文件名作为访问文件的标识。
介质:一般是磁盘、磁带、光盘等。
2、内存文件:在内存中开辟一段空间,以文件的方式存放数据。
如,DOS虚拟磁盘驱动程序 RAMDRIVE.SYS建立的虚拟磁盘上存放的文件。 Windows9.X恢复盘也建立虚拟磁盘,用于临时存放系统命令文件。
3、操作系统把与主机关联的终端也当作文件处理,如:
键盘,输入文件显示器:输出文件打印机:输出文件
4,C语言把文件看作一个字节序列,即由一连串的字节组成,称为“流 (stream)”,以字节为单位访问,没有记录的界限(实际存在界限,例如,在 FAT16文件系统中,文件的最大长度是 2GB)。
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作文件的概念
5、按文件所依附的介质来分:有磁盘文件、磁带文件、内存文件、设备文件等。
6、按文件的内容区分:有源程序文件、目标文件、数据文件等。
7、按文件中的数据组织形式来分:数据文件可分为 ASCII码文件和二进制文件。
ASCII码文件,又称为“文本文件” (text),其每一个字节存放一个
ASCII码。
二进制文件,把内存中的数据按其在内存中的存储形式存放在磁盘上。
例、十进制整数 10000,
在内存中占两字节,其存放形式是,0010,0111,0001,0000。
在二进制文件中也按这中方式存放。
在 ASCII文件中,存放为 31H,30H,30H,30H,30H,占五个字节,它们分别是 1,0,0,0,0,0字母的 ASCII码。
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作文件的概念
00110
001
00110
000
00110
000
00110
000
00110
000
1 0 0 0 0
0010
0111
0001
0000
0010
0111
0010
0000
内存中存储形式
ASCII码形式整数 10000 二进制形式返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作文件的概念
8、按照操作系统对磁盘文件的读写方式,文件可以分为“缓冲文件系统”和“非缓冲文件系统”。
缓冲文件系统:操作系统在内存中为每一个正在使用的文件开辟一个读写缓冲区。
非缓冲文件系统:操作系统不开辟读写缓冲区。
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作
§ 13.2 文件类型指针
在程序执行过程中,
运行结果 → 磁盘文件中;
运行过程 ← 磁盘文件。
使用文件时,内存开辟了一个区域用于存放文件的有关信息,这些信息被保存在用 FILE定义的结构体类型变量中,
Turbo C在 stdio.h中对 FILE有定义,FILE
是自定义的结构体类型,有时也称文件类型。
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作文件类型指针
typedef struct {
int _fd ; /*文件号 */
int _cleft ; /* 缓冲区中剩下的字符 */
int _mode ; /*文件操作模式 */
char *_nextc; /* 下一个字符位置 */
char *_buff; /* 文件缓冲区位置 */
} FILE;
有了 FILE 文件类型,就可以定义 FILE类型的变量了
如,FILE *fp fp:
是指向 FILE结构体类型的指针变量,通过结构体中的文件信息就可以访问该文件。
文件打开后,就将文件的有关信息赋给了指针变量,
从而指针变量指向该文件。
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作
§ 13.3 文件的打开与关闭
13.3.1 fopen,打开文件的函数
形式,FILE *fp
fp=fopen(文件名,使用文件方式);
其中使用方式:
,r”,读
,w”,写
,a”,追加
例,fp=fopen(“A1”,,r” )
( fp是指向文件的结构体类型的指针变量,其成员的值与打开文件信息有关)。
A1与 fp便建立了联系,对 fp的操作实际上就是对 A1的操作。
表示以读的方式打开文件 A1,fopen函数将带回对 A1操作的有关信息,如:标识、
剩余字符、方式等返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作几点说明:
1.打开文件时告诉编译系统三个信息
①根据打开的文件名,以进行访问 ;
②使用文件的方式 (如:读、写、追加)
③通过指针变量指向被打开的文件。
2,用 fopen 函数打开文件时,可能出现的错误,
①,r” 方式打开一个不存在的文件 ;
②磁盘坏 ;
③,w”方式时磁盘满,以上情况 fopen都将带回一个空指针值 NULL(也称 0值 )
3,常用打开文件的方法
if((fp=fopen(“file”,,r” )) = = NULL )
{ printf(,cannot open this file \ n”);
exit(0) ; }
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作
13.3.2 文件的关闭
fclose函数
形式,fclose(文件指针 ) ;
目的:
1.使文件指针不指向该文件,以防文件被误用和修改。
2.不管缓冲区数据满否,都将缓冲区中的数据输出到文件。
3.关闭成功,fclose 返回 0 值;
4.关闭失败:返回非 0值,则说明关闭文件有误,
如,fopen(fp);
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作
13.4 文件的读写
13.4.1 fputc 和 fgetc 函数
一,fputc函数
形式,fputc(ch,fp) ;
功能:把 ch( 字符常量或变量)输出到 fp所指的文件中,
若输出成功,返回输出的字符,若输出失败,返回 EOF( -1)
二,fgetc 函数
形式,ch=fgetc(fp) ;
功能:从 fp所指的文件中读取一个字符赋给 ch,fgetc 读字符时若遇到文件结束符,返回 EOF( -1)。
三,feof(fp)函数:判断文件状态是否结束,若结束,
返回 1,否则返回 0。
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作四,fputc 和 fgetc 函数使用
例 T13-1.c 从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个,#”为止。
#include,stdio.h”
main( )
{ FILE *fp; char ch,filename[10] ;
printf(“please input file name:\n”);
scanf(“%s”,filename);
if((fp=fopen(filename,,w” ))==NULL)
{printf(“cannot open file \n”); exit(0); }
ch=getchar( );
while(ch !=? #? ) {
fputc( ch,fp); putchar(ch); ch=getchar( ); }
fclose(fp);
}
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作
13.4.2 fread和 fwrite函数
可用来读写一个数据块。
一般调用形式
fread(buffer,size,count,fp)
fwrite(buffer,size,count,fp)
用 fread或 fwrite 可读写任何类型的数据。
buffer:读入(输出)
数据的存放地址;
Size:要读写数据的字节数。 Count,读写多少个 size字节的数据项;
fp,文件类型指针若文件以二进制形式打开,
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作例,T13-2.c
#include,stdio.h”
main()
{ FILE *fp; float f[ 3 ];
int i;
fp=fopen(“a1.c”,“w”);
for(i=0; i<3; i++)
scanf(“%f”,&f[ i ]) ;
FILE * fp; fp=fopen (“a1.dat”,“r,);
fread(f,4,3,fp);
printf(“f[0]=%f,f[1]=%f,f[2]=%f \n”,
f[ 0 ],f[ 1 ],f[ 2 ]);
fread(&f[0],4,1,fp);
printf(“f[0]=%f \n”,f[ 0 ]);
}
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作例,T13-3.c
从键盘输入 4个学生的有关数据,然后把它们存储到磁盘文件 stud-lis.dat中。
#include,stdio.h”
#define size 4
struct student_type { char name[10];
int num; int age;
char addr[15]; } stud[size];
void save( )
{ FILE *fp; int i;
if((fp=fopen(“stud-lis.c”,,wb” ))==NULL)
{printf(“cannot open file \ n”); return; }
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作例,T13-3.c
for(i=0; i< size; i++)
if(fwrite(&stud[i],sizeof(struct student_type),1,
fp) != 1)
printf(“file write error \ n”);
}
main( )
{ int i;
for(i=0; i<size; i++)
scanf(“%s%d%d%s”,
stud[i].name,&stud[i].num,
&stud[i].age,stud[i].addr );
save( );
}
调用成功时,返回 count值,
此处的 count 值为 1 个单位返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作例 T13-4.c 从 stud-lis.dat中读出数据并在屏幕上显示
#include,stdio.h”
#define SIZE 4
struct student_type
{ char
name[10];
int num;
int age;
char
addr[15];
} stud[SIZE];
main( )
{ int i;
FILE *fp; fp=fopen(“stud –
lis.dat”,,rb” );
for(i=0; i<SIZE ; i++) {
fread(&stud[i],
sizeof(struct student_type),1,
fp);
printf(“%-10s%4d%4d%-
15s \ n”,stud[i].name,
stud[i].num,stud[i].age,
stud[i].addr); }
}
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作
12.4.3 fprintf 和 fscanf 函数
按格式对磁盘文件中的数据进行读写,
文件内容可读、可修改。
一般调用形式
fprintf(文件指针,格式字符串,输出表列);
fscanf(文件指针,格式字符串,输入表列);
功能:把数据写入磁盘文件或从磁盘文件中读入数据。
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作例 T12-5.c 用 fprintf 和 fscanf 建立和读磁盘文件 stud,txt
#include,stdio.h”
#define SIZE 4
struct student_type {char name[10];
int num; int age; char addr[15]; } stud[SIZE];
void save( )
{ FILE *fp;
int i;
if((fp=fopen(“stud-txt.c”,“w” )) ==NULL)
{printf(“cannot open this file\n”); return; }
for(i=0; i<SIZE ; i++)
fprintf(fp,“%-10s%-10d%-10d%-10s \n”,stud[i].name,
stud[i].num,stud[i].age,stud[i].addr);
}
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作例 T12-5.c 用 fprintf 和 fscanf 建立和读磁盘文件 stud,txt
void load ( )
{ FILE *fp;
int i;
if((fp=fopen(“stud-txt.c”,,r,))==NULL)
{printf(“cannot open in file\n”); return; }
for(i=0;i<SIZE; i++) {
fscanf(fp,“%s%d%d%s”,stud[i].name,
&stud[i].num,&stud[i].age,stud[i].addr);
printf(“%-10s %d %d %-15s\n”,
stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作例 T12-5.c 用 fprintf 和 fscanf 建立和读磁盘文件 stud,txt
main( )
{ int i;
for(i=0; i<SIZE; i++)
scanf(“%s%d%d%s”,
stud[i].name,&stud[i].num,
stud[i].age,stud[i].addr);
save ( );
load ( );
}
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作例 T12-6.c 把计算结果 1~10的平方、立方存入 file-dat.c中
#include,stuio.h”
main( )
{ FILE *fp;
int i;
if((fp=fopen(,file-dat.c”,,w” ))==NULL)
{ printf(“cannot open file \ n”);
exit(0); }
for(i=1; i<=10; i++)
fprintf(fp,“%-10d %-10d %-10d\ n”,i,i*i,i*i*i);
fclose(fp);
}
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作例 T12-6.c 将 file-dat.c中数据读出进行自加后输出
#include,stdio.h”
main( )
{ FILE *fp;
int x,i,j,k;
if((fp=fopen(“file-dat.c”,,r” )) ==NULL)
{ printf(“cannot open file \ n”);
exit(0); }
for(x=1; x<=10; x++)
{ fscanf(fp,“%d%d%d\n”,&i,&j,&k);
printf(“%-10d %-10d %-10d\ n”,i+i,j+j,k+k); }
fclose(fp);
}
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作
13.5 文件的定位
13.5.1 rewind (反绕)函数
功能:使位置指针重返到文件的开头
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作例 T13-8.c
#include,stdio.h”
main( )
{ FILE *fp1,*fp2;
fp1=fopen(“file1-da.c”,,r” );
fp2=fopen(“file2-da.c”,,w”);
while(!feof(fp1))
putchar(getchar(fp1));
rewind(fp1);
while(!feof(fp1))
fputc(fgetc(fp1),fp2);
fclose(fp1);
fclose(fp2);
}
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作
13.5.2 fseek 函数和随机读写
随机读写:当某次从数据文件中读完一个单位的数据后,若下一次的读写不是紧接上一次读写的数据之后进行读写,此时可采用定位函数对要读写的数据进行定位,以便从此处开始读取新的数据。 定位函数
fseek 的调用形式:
fseek(文件类型指针,位移量,起始点)
位移量:以“起始点”(文件的开始或文件的当前或末尾) 为基点,程序中起始点可用名字或数字都可以,
向前或向后移动的字节数。
fseek函数一般用于二进制文件,但也可用于文本文件。
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作例 T13-9.c 在 stud1.dat中,从文件头开始,间隔输出文件中的记录
#include,stdio.h”
struct student_type {char name[10]; int num; int age; char
addr[15]; } stud[10];
main( )
{ int i;
FILE *fp;
if((fp=fopen(“stud1.dat”,,rb”))= =NULL)
{ printf(“cannot open file \ n”); exit(0); }
for(i=0; i<10; i+=2)
{ fseek(fp,i*sizeof(struct student_type),0);
fread(&stud[i],sizeof(struct student_type),1,fp);
printf(%s %d %d %s\ n”,stud[i].name,stud[i].num,
stud[i].age,stud[i].addr); }
fclose(fp);
}
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作例 T13-9.c
若 stud1.dat中 10个学生情况如下:
zhang 1001 19 room_101
fun 1002 20 room_102
tan 1003 21 room_103
ling 1004 21 room_104
wang 1005 18 room_105
gao 1006 19 room_106
liu 1007 20 room_107
han 1008 21 room_108
xu 1009 19 room_109
da 1010 20 room_110
运行结果:
zhang 1001 19 room_101
tan 1003 21 room_103
wang 1005 18 room_105
liu 1007 20 room_107
xu 1009 19 room_109
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作
T13-5-3.c 对文本数据文件中的数据通过 fseek有选择的从文件中读入并输出数据
#include,stuio.h”
main( )
{ int i,j,a[10][2];
FILE *fp; fp=fopen(“t13-5-3.dat”,“r”);
for(i=0;i<10;i+=2) {
fseek(fp,i*6,0);
for(j=0;j<2;j++)
{ fscanf(fp,”%d”,&a[i][j]);
if(i%2==0) printf(“\n”);
printf(“%d,,a[i][j]); } }
fclose(fp);
}
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作对文本数据文件中的数据通过 fseek有选择的从文件中读入并输出数据
t13-5-3.dat
1 88
2 99
3 66
4 98
5 100
6 88
7 78
8 85
9 64
10 79
输出:
1 88
3 66
5 100
7 78
9 64
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作
T13-5-4.c 从文件的当前位置读取数据
#include,stuio.h”
main( )
{ int I,j,a[10][2];
FILE *fp;
fp=fopen(“t13-5-4.dat”,“r”);
for(i=0;i<10;i++) {
fseek,0,1);
for(j=0;j<2;j++)
{fscanf(fp,”%d”,&a[i][j]);
if(i%2==0) printf(“\n”);
printf(“%d,,a[i][j]); } }
fclose(fp);
}
T12-5-4.c 从文件的当前位置读取数据返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作
T13-5-4.c 从文件的当前位置读取数据
t13-5-3.dat
1 88
2 99
3 66
4 98
5 100
6 88
7 78
8 85
9 64
10 79
输出:
1 88
2 99
3 66
4 98
5 100
6 88
7 78
8 85
9 64
10 79
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作课堂练习
3.9 3.10 3.12
返回下一页上一页第十三章 文 件 计算机系 彭金莲 制作作业与上机要求
作业,12.3 12.4 12.12
上机要求:作业需上机调试通过