盘、表现器、打印机、磁盘驱动器等逻辑设备,其输入输出都可以通过文
件经管的方式来实现.而在编程时使用至少的要定是磁盘文件,是以本节关键以
磁盘文件为主,具体讲授Turbo C2,0供应的文件操纵函数,毫无疑难这些对文件的操
作函数也符合于非磁盘文件的状况.
另外,Turbo C2,0供应了两类对于文件的函数.一类称做规格文件函数也称
缓冲型文件函数,这是ANSI规格定义的函数;另一类叫非规格文件函数,也称非
缓冲型文件函数.这类函数最早公用于UNIX操纵系统,但似今MS-DOS3,0 以上版
本的操纵系统也能够使用.下面分不实施讲授.
2,2,2 规格文件函数
规格文件函数关键包罗文件的翻开、封闭、读和写等函数.不象BASIC 、
FORTRAN语方有次序文件和随机文件之分, 在翻开时就应按差不的方式必然.
Turbo C2,0同时不辨识这两种文件,但供应了两组函数,即次序读写函数和随机读
写函数.
一、文件的翻开和封闭
任何一个文件在使用往常和使用之后,必须要实施翻开和封闭,这是因为操
作系统对于同时翻开的文件数目是有限定的,DOS操纵系统中, 可以在DEVICE
.SYS中定义许可同时翻开的文件数n(用files=n定义).其中n 为可同时翻开的文
件数,同样n<=20,是以在使用文件前应翻开文件,才可对其中的信息实施存取.
用完之后需要封闭,否那么将会展示部分意想不到的差错.Turbo C2,0供应了翻开
和封闭文件的函数.
2,fopen()函数
fopen函数用于翻开文件,其调用规格为:
FILE *fopen(char *filename,*type);
在讲授那个函数之;前,先领会一下下面的学识.
(2) 流(stream)和文件(file)
流和文件 在Turbo C2,0中是有区不的,Turbo C2,0 为编程者和被会晤的设
备之间供应了一层笼统的东西,称之为"流",而将具体的事实设备叫做文件.
流是一个逻辑设备,具有同样的行为.是以,用来实施磁盘文件写的函数也同样
可以用来实施打印机的写入.在Turbo C2,0中有两种性质的流: 文字流( text
stream)和二进制(binary stream).对磁盘来讲定是文本文件和二进制文件.本
软件为了便于让读者易懂得得Turbo C2,0语言而没有对流和文件作特不辨识.
(2) 文件指针FILE
事实上FILE是一个新的信息类型.它是Turbo C2,0的全然信息类型的集合,
称之为结构指针.有关结构的概念将在第四节中具体讲授,那个地点只要将FILE懂得得
为一个包罗了文件经管有关信息的信息结构,即在翻开文件时必须先定义一个文
件指针.
(3) 日后讲授的函数调用规格将开门见山写出情势指标的信息类型和函数返回值
的信息类型.例似:上面翻开文件的函数,返回一个文件指针,其中情势指标有
两个,均为字符型变量(字符串数组或字符串指针).本软件不再对函数的调用格
式作具体表明.
似今再来看翻开文件函数的用法.
fopen()函数中第一个情势指标示意文件名,可以包涵路径和文件名两部分.
似:
“B:TEST.DAT”
“C:\TC\TEST.DAT”
介入将路径写成"C:\TC\TEST.DAT"是不精确的,这一点要特不看重.
第二个情势指标示意翻开文件的类型.对于文件类型的法那么参见下表.
表 文件操纵类型
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
字符 含义
────────────────────────────
“r” 翻开文字文件只读
“w” 创立文字文件只写
“a” 增补,介入文件不存在那么创立一个
“r+” 翻开一个文字文件读写
“w+” 创立一个文字文件读写
“a+” 翻开或创立一个文件增补
“b” 二进制文件(可以和上面每一项合用)
“t” 文这文件(默许项)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
介入要翻开一个CCDOS子目录中,文件名为CLIB的二进制文件,可写成:
fopen(“c:\ccdos\clib”,“rb”);
介入顺遂的翻开一个文件,fopen()函数返回文件指针, 否那么返回空指针
(NULL).由此可判断文件翻开是否顺遂.
2,fclose()函数
fclose()函数用来封闭一个由fopen()函数翻开的文件 ,其调用规格为:
int fclose(FILE *stream);
该函数返回一个整型数.当文件封闭顺遂时,返回0, 否那么返回一个非零值.
可以依照函数的返回值判断文件是否封闭顺遂.
例20:
#iclude
main()
{
FILE *fp; 定义一个文件指针
int i;
fp=fopen(“CLIB”,“rb”); 翻开日后目录名为CLIB的文件只读
if(fpNULL) 判断文件是否翻开顺遂
puts(“File open error”);提示翻开不顺遂
i=fclose(fp); 封闭翻开的文件
if(i0) 判断文件是否封闭顺遂
printf(“O,K”); 提示封闭顺遂
else
puts(“File close error”);提示封闭不顺遂
}
二、有关文件操纵的函数
本节所讲的文件读写函数均是指次序读写,即读写了一条信息后,指针自动
加2,下面分不讲授写操纵函数和读操纵函数.
2,文件的次序写函数
fprintf()、fputs()和fputc()函数
函数fprintf()、fputs()和fputc()均为文件的次序写操纵函数, 其调用格
式似下:
int fprintf(FILE *stream,char *format,);
int fputs(char *string,FILE *steam);
int fputc(int ch,FILE *steam);
上述三个函数的返回值均为整型量.fprintf() 函数的返回值为事实写入文
件中的字罕个数(字节数).介入写差错,那么返回一个负数,fputs()函数返回0时
表明将string指针所指的字符串写入文件中的操纵顺遂,返回非0时, 表明写操
作失败.fputc()函数返回一个向文件所写字符的值,如今写操纵顺遂, 否那么返
回EOF(文件终了终了其值为-2,在stdio.h中定义)示意写操纵差错.
fprintf( ) 函数中规格化的法那么与printf( ) 函数同样, 所差不的只是
fprintf()函数是向文件中写入.而printf()是向屏幕输出.
下面讲授一个例子,运行后产后一个test.dat的文件.
例22:
#include
main()
{
char *s=“That’s good news”); 定义字符串指针同时初始化
int i=627; 定义整型变量同时初始化
FILE *fp; 定义文件指针
fp=fopne(“test.dat”,“w”); 创立一个文字文件只写
fputs(“Your score of TOEFLis”,fp);向所建文件写入一串字符
fputc(‘:’,fp); 向所建文件写冒号:
fprintf(fp,“%d\n”,i); 向所建文件写一整型数
fprintf(fp,“%s”,s); 向所建文件写一字符串
fclose(fp); 封闭文件
}
用DOS的TYPE号令表现TEST.DAT的内容似下所示:
屏幕表现
Your score of TOEFL is:627
That’s good news
2,文件的次序读操纵函数
fscanf()、fgains()和fgainc()函数
函数fscanf()、fgains()和fgainc()均为文件的次序读操纵函数,其调用规格
似下:
int fscanf(FILE *stream,char *format,);
char fgains(char *string,int n,FILE *steam);
int fgainc(FILE *steam);
fscanf()函数的用法与scanf()函数邻近, 只是它是从文件中读到信息.
fscanf()函数的返回值为EOF(即-2),表明读差错,否那么读信息顺遂.fgains()函
数从文件中读取至少n-2个字符(n用来指定字符数),同时把它们放入string指向的
字符串中,在读入之后自动向字符串未尾加一个空字符,读顺遂返回string指针,
失败返回一个空指针.fgainc()函数返回文件日后位置的一个字符, 读差错时返
回EOF.
下面程序读取例22产生的test.dat文件,同时将读出的结论表似今屏幕上.
例22
#include
main()
{
char *s,m[20];
int i;
FILE *fp;
fp=fopen(“test.dat”,“r”); 翻开文字文件只读
fgains(s,25,fp); 从文件中读取23个字符
printf(“%s”,s); 输出所读的字符串
fscanf(fp,“%d”,&i); 读取整型数
printf(“%d”,i); 输出所读整型数
putchar(fgainc(fp)); 读取一个字符同时输出
fgains(m,27,fp); 读取26个字符
puts(m); 输出所读字符串
fclose(fp); 封闭文件
gainch(); 守侯任一键
}
运行后屏幕表现:
Your score of TOEFL is:627
That’s good news
介入将上例中fscanf(fp,“%d”,&i)改为fscanf(fp,“%s”,m), 再将其后
的输出语句改为printf(“%s”,m),那么可得到同样的结论.由此可见Turbo C2,0
中只倘如果 读文字文件,那么不论是字符仍是数字都将按其ASCII值操纵.另外还要
表明的一点定是fscanf()函数读到空白符时,便自动终啦,在使用时要特不看重.
3,文件的随机读写
偶尔用户想开门见山读取文件中间某处的信息,似果用文件的次序读写必须从文件
头最早直到要求的文件位置再读,这清楚未便当.Turbo C2,0供应了一组文件的
随机读写函数,即可以将文件位置指针定位在所要求读写的地点开门见山读写.
文件的随机读写函数似下:
int fseek (FILE *stream,long offset,int fromwhere);
int fread(void *buf,int size,int count,FILE *stream);
int fwrite(void *buf,int size,int count,FILE *stream);
long ftell(FILE *stream);
fseek()函数的作用是将文件的位置指针设置到从fromwhere最早的第offset
字节的位置上,其中fromwhere是以下几个宏定义之一:
文件位置指针起始统计位置fromwhere
━━━━━━━━━━━━━━━━━━━━━━━━━━━
符号常数 数值 含义
───────────────────────────
SEEK_SET 0 从文件开头
SEEK_CUR 2 从文件指针的现行位置
SEEK_END 2 从文件末端
━━━━━━━━━━━━━━━━━━━━━━━━━━━
offset是指文件位置指针从指定最早位置(fromwhere指出的位置)跃过的字
节数.它是一个长整型量,以撑持大于65K字节的文件.fseek()函数同样用于对
二进制文件实施操纵.
当fseek()函数返回0时表明操纵顺遂,返回非0示意失败.
下面程序从二进制文件test_b.dat中读取第8个字节.
例23:
#include
main()
{
FILE *fp;
if((fp=fopen(“test_b.dat”,“rb”))==NULL)
{
printf(“Can’t open file”);
exit(2);
}
fseek(fp,8,2,SEEK_SET);
fgainc(fp);
fclose(fp);
}
fread()函数是从文件中读count个字段,每个字段长度为size个字节,同时把
它们存放到buf指针所指的缓冲器中.
fwrite()函数是把buf指针所指的缓冲器中,长度为size个字节的count个字
段写到stream指向的文件中去.
跟着读和写字节数的增大,文件位置辅导器也增大,读几个字节,文件位
置辅导器相应也跃过几个字节.读写终了函数返回所读和所写的字段个数.
ftell()函数返回文件位置辅导器的日后值, 那个值是辅导器从文件头最早
算起的字节数,返回的数为长整型数,当返回-2时,表清楚示差错.
下面程序把一个浮点数组以二进制方式写入文件test_b.dat中.
例25:
#include
main()
{
float f[6]={3,2,-5,35,25,05,0.2,50.56,80.5};
定义浮点数组同时初始化
int i;
FILE *fp;
fp=fopen(“test_b.dat”,“wb”);创立一个二进制文件只写
fwrite(f,sizeof(float),6,fp);将6个浮点数写入文件中
fclose(fp); 封闭文件
}
下面例子从test_b.dat文件中读200个整型数,同时把它们放到dat数组中.
例25:
#include
main()
{
FILE *fp;
int dat[200];
fp=fopen(“test_b.dat”,“rb”);翻开一个二进制文件只读
if(fread(dat,sizeof(int),200,fp)!=200)
判断是否读了200个数
{
if(feof(fp))
printf(“End of file”);不到200个数文件终了
else
printf(“Read error”); 读数差错
fclose(fp); 封闭文件
}
看重:
当用规格文件函数对文件实施读写操纵时,起首将所读写的内容放进缓冲区,
即写函数只对输出缓冲区实施操纵,读函数只对输入缓冲区实施操纵.例似向一
个文件写入内容,所写的内容将起首放在输出缓冲区中,直到输出缓冲区存满或
使用fclose()函数封闭文件时,缓冲区的内容才会写入文件中.似果无fclose()
函数,那么不或许向文件中存入所写的内容或写入的文件内容不全.有一个对缓冲区
实施刷新的函数,即fflush(),其调用规格为:
int fflush(FILE *stream);
该函数将输出缓冲区的内容事实写入文件中,而将输入缓冲区的内容清撤除.
5,feof()和rewind()函数
这两个函数的调用规格为:
int feof(FILE *stream);
int rewind(FILE *stream);
feof()函数探测文件位置辅导器是否到达了文件末端, 似果是那么返回一个非0
值,否那么返回0.那个函数对二进制文件操纵特不有效,因为二进制文件中, 文
件末端标记EOF也是一个合法的二进制数, 只简单的查抄读入字符的值来判断文
件是否终了是不可的.介入那样的话,或许会造成文件未末端而被信任末端,所
以就必须有feof()函数.
下面的这条语句是常用的判断文件是否终了的方式.
while(!feof(fp))
fgainc(fp);
while为循环语句,将在下面讲授.
rewind()函数用于把文件位置辅导器移到文件的起点处,顺遂时返回0, 否
那么,返回非0值.
2,2,2 非规格文件函数
这类函数最早用于UNIX操纵系统,ANSI规格未定义, 但偶尔也常常用到,
DOS 3,0以上版本撑持这些函数.它们的头文件为io.h.
一、文件的翻开和封闭
2,open()函数
open()函数的作用是翻开文件,其调用规格为:
int open(char *filename,int access);
该函数示意按access的要求翻开名为filename的文件,返回值为文件描述字,
其中access有两部分内容:全然模式和修饰符,两者用" "(“或”)方式毗连.修
饰符可以有多个,但全然模式只能有一个.access的法那么似表3-2,
表3-2 access的法那么
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
全然模式 含义 修饰符 含 义
────────────────────────────
O_RDONLY 只读 O_APPEND 文件指针指向末端
O_WRONLY 只写 O_CREAT 文件不存在时创立文件,
属性按全然模式属性
O_RDWR 读写 O_TRUNC 似果文件存在,将其长度
缩为0,属性不变
O_BINARY 翻开一个二进制文件
O_TEXT 翻开一个文字文件
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
open()函数翻开顺遂,返回值定是文件描述字的值(非负值),否那么返回-2,
2,close()函数
close()函数的作用是封闭由open()函数翻开的文件,其调用规格为:
int close(int handle);
该函数封闭文件描述字handle相连的文件.
二、读写函数
2,read()函数
read()函数的调用规格为:
int read(int handle,void *buf,int count);
read()函数从handle(文件描述字)相连的文件中,读取count个字节放到buf
所指的缓冲区中,返回值为事实所读字节数,返回-2示意犯错.返回0 示意文件
终了.
2,write()函数
write()函数的调用规格为:
int write(int handle,void *buf,int count);
write()函数把count个字节从buf指向的缓冲区写入与handle相连的文件中,
返回值为事实写入的字节数.
三、随机定位函数
2,lseek()函数
lseek()函数的调用规格为:
int lseek(int handle,long offset,int fromwhere);
该函数对与handle相连的文件位置指针实施定位,功能和用法与fseek() 函
数同样.
2,tell()函数
tell()函数的调用规格为:
long tell(int handle);
该函数返回与handle相连的文件现生位置指针,功能和用法与ftell()同样.