目录
一、文件概述
什么是文件?磁盘上的文件是文件
在程序设计中,我们一般谈的文件有两种:程序文件、数据文件
文件名:
一个文件要有一个唯一的文件标识,以便用户识别和引用
文件名包含3部分:文件路径+文件名主干+文件后缀
文件类型:根据数据的组织形式,数据文件被称为文本文件或者二进制文件
–数据在内存中以二进制形式存储,如果不加以转换的输出导外存,就是二进制文件
–ASCII文件又称文本(text)文件,它的每一个字节放一个ASCII代码,代表一个字符。
C语言中当打开一个文件时,执行程序会自动打开三个标准文件—标准输入文件、标准输出文件和标准错误文件以及与这三个文件相连的三种流—标准输入流、标准输出流和标准错误流。
二、文件类型指针
要读写一个文件,必须知道与该文件有关的信息(如文件名,文件状态,文件当前的读写位置,文件缓冲区的大小与位置等等)这些信息被系统保存在一个结构体中,这个结构体中的信息组成了文件类型。系统为该结构类型起了个专用的名字:FILE。
FILE类型的结构和操作系统有关,也就是说该结构的成员随系统对文件处理的方式的不同而不同。
struct file
{
int level; /*缓冲区被占用的程度*/
unsigned flags; /*文件状态标记*/
char fd; /*文件描述符*/
unsigned char hold; /*如无缓冲区,则不读取字符*/
int bsize; /*缓冲区大小*/
unsigned char *buffer; /*文件缓冲区指针*/
unsigned char *curp; /*文件定位指针*/
unsigned istemp; / *暂时文件指示器*/
short token; / *用于有效性检查*/
};
文件在使用前需要打开文件,结束后应该关闭文件
ANSIC规定使用fopen打开文件,fclose关闭文件
如果打开的是二进制文件,则增加一个字符b(binary)。其他字符的含义为:r代表read,用于读;w代表write,用于写;a代表append,用于追加
(1)凡是打开方式字符串中含有字符“r”的,所打开的文件必须是已存在的文件,对不存在的文件不能打开读。
(2)凡是打开方式中带有“w”字符的,所打开的文件可以是已经存在的,也可以是尚不存在的。若不存在时,则先要建立一个新文件,然后在里面写内容;若文件已经存在,则会把原文件的内容覆盖掉,写入新的内容。
(3)凡含有字符“a”,以追加方式打开的文件也可以不存在,若不存在则建立一个新文件后再追加;若已存在,则在文件的尾部追加。
(4)以“r+”和“w+”方式打开的文件都是既可用于读,又可用于写的。其差别是,以“w+”方式打开的是一个新文件,应先写入内容,然后可以读。
(5)在打开文件的操作中有可能出现故障,如当文件所在的磁盘未准备好时,不能把文件打开,这时打开文件函数fopen就返回NULL值。
(6)有三个和标准输入/输出流对应的设备文件不需用户打开,在执行程序时,系统自动将它们打开。这三个文件是标准输入文件、标准输出文件和标准出错文件,指向它们的文件指针分别是stdin、stdout和stderr。
三、文件是输入输出
1. 文件的字符输入/输出函数fgetc和fputc
(1) fgetc函数
fgetc函数的调用格式为:
<字符变量> = fgetc(<文件指针>)
功能:从<文件指针>所指的文件中读入一个字符赋给<字符变量>。
(2) fputc函数
设 ch 为字符类型,则其调用格式为:
fputc( ch ,<文件指针>)
功能:把字符ch(变量或常量)放入<文件指针>所指的文件中。如果操作失败,则返回EOF。EOF是在stdio.h文件中定义的符号常量,值为-1。
2. 文件的字符串输入/输出函数fgets()和fputs()
(1) fgets()函数
fgets 函数的调用格式为:
fgets(str,n,fp)
其中,str 为指定的字符数组;n为包括’\0’字符在内的字符个数;fp 为文件指针。
功能:从fp所指文件中读取n-1个字符(留一个字符给’\0’),并把它们放入str字符数组中。当满足下列条件之一时,读取结束:
• 已经读取了n-1个字符;
• 当前读到的字符为回车符;
• 已读到文件的末尾。
(2) fputs函数
fputs函数的调用格式为:
fputs( str,fp )
其中,fp为文件指针,str为一字符串,它可以是指向字符串的指针,也可以是字符数组名,还可以是字符串常量。
功能:把指定字符串放到指定的文件中。fputs函数在将字符串写入文件时,把字符串后的’\0’字符自动舍去。
fputs(str, stdout)≠puts(str)
因为puts()函数是把字符串尾部的’\0’字符变成回车符输出,而fputs函数则是舍去字符串末尾的’\0’字符。
fputs函数若输出成功,返回值为0;若输出失败, 返回值为 EOF (即-1)。
3. 文件数据块的输入/输出函数fread和fwrite
(1) fread函数
fread函数调用的一般格式为:
fread(buf , size , count , fp);
其中buf是一个指针,指向输入数据在内存中的起始地址;size为要读取的字节个数;count为要读取多少个size字节的数据项;fp为指向由fopen打开的文件的指针。
功能:从fp指定的文件中读取sizecount个字节的数据,并把它放入由buf指定的内存中。
(2) fwrite函数
fwrite函数调用的格式为:
fwrite(buf,size,count,fp);
其中,参数的个数和类型与 fread 函数完全一样,只是它进行相反的操作。这里的 buf 是输出数据在内存中存放的地址。
功能:把buf中大小为sizecount个字节的数据写入fp指定的文件中。如语句:
fwrite( ibuf , 2 , 5 , fp);
是把整型数组中的5个整数写入fp指定的文件中。
返回值:若输出成功,则返回写入文件中的数据项数;若输出失败,则返回-1。
4. 文件的格式化输入/输出函数fscanf和fprintf
fscanf(<文件指针>,<格式控制串>,<输入列表>)
fprintf(<文件指针>,<格式控制串>,<输出列表>)
功能与 scanf函数和 printf函数几乎一样,差别只在于它们可以对任何文件进行输入/输出,而scanf和 printf 只对终端设备进行,如:
fscanf(fp,"%d%f",&i,&x);
表示从fp所指文件中读入一个整数给i,一个浮点数给x(这样做必须先要知道磁盘上的数据是如何存储的)。