第 9 章 C语言库函数
9.1 概述
9.2 文件类型指针
9.3 文件的打开与关闭
9.4 文件的读写
9.5 文件的定位
9.6 出错的检查
9.7 非缓冲文件系统
第 9 章 C语言库函数
9.1 概述
C语言将文件看作是一个字符 (字节 )序列组成的 。
分为 ASCII文件 和 二进制文件 两种 。
C的, 缓冲文
件系统, 自动地
在内存中开辟一
个文件缓冲区,
在对文件进行处
理时, 通过文件
缓冲区进行输入
与输出 。
程序
数据区
输出
缓冲区
磁盘
文件
输入
缓冲区
9.2 文件类型指针
“文件指针”是缓冲文件系统中的一个重要概念。在
C系统的头文件 stdio.h 中定义了一个名叫 FILE的结构
体类型:
typedef struct
{short
unsigned
char
unsigned char
short
unsigned char
unsigned char
unsigned
short
}FILE;
level;
flage;
fd;
hold;
bsize;
*buffer;
*curp;
istemp;
token;
/* 缓冲区饱和程度 */
/* 文件状态标志 */
/* 文件号 */
/* 无缓冲区取消字符输入 */
/* 缓冲区大小,缺省值 512 */
/* 缓冲区 */
/* 当前活动指针 */
/* 草稿文件标识 */
/* 作正确性检验 */
9.3 文件的打开与关闭
在对文件读、写之前必须先打开该文件,使用结束
后应关闭该文件。
1,文件打开函数 fopen
函数调用格式:
FILE *fp;
fp=fopen(“文件名,,“使用方式, );
以指定的使用方式打开指定的文件。
说明,
?用 fp 指向打开的文件后,就可以用它来访问该文件。
?,文件名”为任何合法的 DOS文件名。
?使用方式 见下表,
使用
方式 含 义 若文件不存在 若有此文件
r 只读 (文本文件 ) 返回错误标志 打开指定的文件
W 只写 (文本文件 ) 建立新文件 打开指定的文件并清空内容
a 添加 (文本文件 ) 建立新文件 打开指定的文件,但只能在文件末尾添加数据
r+ 读 /写 (文本文件 ) 返回错误标志 打开指定的文件
w+ 读 /写 (文本文件 ) 建立新文件 打开指定的文件并清空内容
a+ 读 /写 (文本文件 ) 建立新文件 打开指定的文件,可读 /写
rb 只读 (二进制文件 ) 返回错误标志 打开指定的文件
wb 只写 (二进制文件 ) 建立新文件 打开指定的文件并清空内容
ab 添加 (二进制文件 ) 建立新文件 打开指定的文件,但只能在文件末尾添加数据
rb+ 读 /写 (二进制文件 )返回错误标志 打开指定的文件
wb+读 /写 (二进制文件 )建立新文件 打开指定的文件并清空内容
ab+ 读 /写 (二进制文件 )建立新文件 打开指定的文件,可读 /写
?文本文件中的回车换行符在输入时转换为一个换行符,
在输出时又转换为回车换行符。
?为了可靠地打开指定的文件,常用下列方法:
if ((fp=fopen(“file1”,,r,))==NULL)
{printf(“cannot open this file\n”);
exit(0);
}
2,文件关闭函数 fclose
使用完一个文件后必须关闭它,以防数据丢失和被
其它操作误用。
fclose函数的调用格式:
fclose(文件指针 );
关闭文件时的操作就是使指针与文件“脱钩”。正常
关闭时 fclose函数返回 0值,关闭有误时返回 非 0值。
9.4 文件的读写
1,fgetc 函数
fgetc 函数的功能是从以读或读写方式打开的文件
中读入一个字符。 调用格式:
ch=fgetc(fp);
ch 为字符型变量; fp为指向文件的文件类型指针。
2,fputc 函数
fputc函数的功能是将一个字符写入以写方式打开的
磁盘文件。 调用格式:
fputc(ch,fp);
ch是要输出的字符; fp为指向文件的文件类型指针。
EOF为标准文件的结束标志。在流式文件中,文件
结束标志为 feof。当 fp指向的文件遇到文件结束标志时,
feof(fp)=1,否则为 0。
3,fread 函数 和 fwrite 函数
它们是 ANSI C 标准提供的函数。 调用格式为,
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
buffer 为指向 fread 读入数据存放的起始地址 或
fwrite 输出数据的起始地址的指针。
size 为读写的字节数。
fp 为文件类型指针。
count 为读写 size 字节的数据项的个数。
? 如果 fread或 fwrite调用成功,则函数返回值为 count
的值,即输入或输出数据项的完整个数。
? 如果文件以二进制形式打开,则 fread和 fwrite函数就
可以读写任意类型的数据。 如,
fread(f,4,2,fp);
从 fp所指的文件读入 2个数据存储到实型数组 f中。
4,fprintf 和 fscanf 函数
调用格式,
fprintf(文件指针,格式字符串,输出项表 );
fscanf(文件指针,格式字符串,输入项表 );
fprintf 和 fscanf 函数与 printf 和 scanf 函数的不同
之处是:前者的对象为磁盘文件,而后者的对象为终端。
5,putw 和 getw 函数
调用格式,
putw(i,fp); 将整型量 i的值输出到 fp指向的文件
i=getw(fp); 从 fp指向的文件中读入一个整数并赋
给整型变量 i
6,fgets 和 fputs 函数
fgets 函数的调用格式:
fgets(str,n,fp);
从 fp 指向的文件中读入 n–1 个字符并放到字符数
组 str 中。该函数的返回值为 str 的首地址。
fputs 函数的调用格式:
fputs(str,fp);
将一个字符串输出到 fp 指向的文件中。这里的 str
可以是字符串常量、字符串数组名或字符型指针。
输出成功,函数值为 0,失败时为 非 0。
例 9.1 将一个磁盘文件中的信息复制到另一个磁盘文件中。
用带参数的 main函数编写。
#include“stdio.h”
main(argc,argv)
int argc;
char *argv[ ];
{FILE *in,*out;
char ch;
if (argc != 3)
{printf(“你忘了输入文件名,\n”);
exit(0);
}
if((in=fopen(argv[1],“r”))==NULL)
{printf(“cannotopen infile.\n”);
exit(0);
}
if((out=fopen(argv[2],“w”))==NULL)
{printf(“cannotopen outfile.\n”);
exit(0);
}
while(!feof(in)) fputc(fgetc(in),out);
fclose(in);
fclose(out);
}
7,读写其它类型的数据
ANSI C 标准的 fread 和 fwrite 函数可以读写任
何类型的数据 。 当用户使用的系统未提供这两个函数
时, 可以定义所需的函数 。
以二进制方式写入一个实数 num 至 fp 指向的文
件之函数可以定义如下,
putfloat(num,fp)
float num;
FILE *fp;
{char *s;
int count;
s=#
for (count=0; count<4; count++)
putc(s[count],fp);
}
9.5 文件的定位
1,rewind 函数
rewind函数的作用是将文件指针重置于文件的开头。
例 10.2 将一磁盘文件显示在屏幕上并复制到另一文件。
#include,stdio.h”
main( )
{FILE *fp1,*fp2;
fp1=fopen(“file1.c”,“r”);
fp2=fopen(“file2.c”,“w”);
while ( !feof(fp1)) putchar(fgetc(fp1) );
rewind(fp1);
while ( !feof(fp1)) fputc(fgetc(fp1),fp2);
fclose(fp1); fclose(fp2);
}
2,fseek 函数与文件的随机读写
C的流式文件既可以顺序读写也可以随机读写。
fseek的调用格式:
fseek( fp,位移量,起始点 );
其中,fp为指向文件的指针;
起始点
文件开头
文件当前位置
文件末尾
代码
0
1
2
ANSI C标准的指定名
SEEK_SET
SEEK_CUR
SEEK_END
位移量是以“起始点”为基点向前移动的字节数。
ANSI C规定在位移量的末尾加上字母 L表示 long型,
以便在读写大于 64K的文件时不致出错。 例如,
fseek(fp,100L,0); 将指针移到离文件头 100个字节处
fseek(fp,50L,1); 将指针移到离当前位置 50个字节处
fseek(fd,–10L,1); 将指针从当前位置倒退 10个字节
fseek(fp,–10L,2); 将指针移到文件末倒数 10个字节处
3,ftell 函数
调用格式:
i = ftell(fp);
该函数得到 fp 指向的流式文件中 fp 的当前位置并
赋给变量 i 。
如果 ftell函数的返回值为 –1L,表示出错。
9.6 出错的检查
1,ferror 函数
调用格式:
ferror(fp);
该函数用来检查各种输入输出函数 (如 fputc,fgetc、
fread,fwrite等 )的操作是否有错。若有错,函数的
返回值为非 0,若无错,函数的返回值为 0。
2,clearerr 函数
调用格式:
clearerr(fp);
调用该函数后,使文件错误标志和文件结束标志及
ferror(fp)之值均变为 0。
9.7 非缓冲文件系统
非缓冲文件系统不属于 ANSI C标准的范围,
但了解它对于阅读非 ANSI C标准程序时不致感
到困难。
缓冲文件系统称为高级磁盘 I/O系统,它通
过指针访问文件。非缓冲文件系统称为低级磁盘
I/O系统,它不是通过指针访问文件,而是用一个
整数代表一个文件。这个正整数称为“文件号”。
C编译系统允许同时最多打开 10个文件,且
按文件打开的先后顺序自动将文件号定为 1~10。
1,open 函数
调用格式:
open(文件名,打开方式 );
该函数用来打开一个非缓冲文件。
其中,打开方式
0
1
2
作用
只读
只写
读 /写
若打开成功,该函数返回一个正整数 (文件号 ),
否则返回 –1。
2,close 函数
调用格式:
close(fd);
关闭由正整数 fd代表的非缓冲文件。
若关闭成功,该函数返回值为 0,否则返回值为 –1。
3,creat 函数
Turbo C不允许用 open函数建立新文件, 而提供
一个 creat 函数用来建立新文件 。
调用格式:
creat(文件名,打开方式 );
若建立成功, 该函数返回一个正整数 (文件号 ),否
则返回 –1。
4,read 函数
调用格式:
read(fd,buf,count);
read函数的作用是从正整数 fd代表的非缓冲文件中
读出 count 个字节的信息到 buf指向的缓冲区中 。 读出
成功, read函数返回值为读出的字节数, 遇文件结束,
read函数返回值为 0,否则为 –1。
5,write 函数
调用格式,
read(fd,buf,count);
write 函数的作用是将 buf 指向的缓冲区中 count
个字节的信息写入正整数 fd代表的非缓冲文件中。写入
成功,write函数返回值为写入的字节数,否则为 –1。
6,lseek 函数和随机读写
调用格式,
read(fd,buf,count);
lseek函数用来移动文件位置指针。其作用类似于
fseek函数,不同之处是用文件号而不是用指针来标识
文件。 例,
lseek(fd,100L,0); 将文件位置指针移到离文件开头 100字节处
lseek(fd,–10L,1); 将文件位置指针从当前位置倒退 10字节
课外练习:习题册中 习题十 全部