017-文件
一、C文件的有关概念
1.什么是文件
文件是指存储在外存储器上的数据的集合。
- 操作系统是以文件为单位对数据进行管理的。
- 输入输出是数据传送的过程,数据如流水一样从一处流向另一处,因此常将输入输出形象地称为流(stream),即输入输出流。
- C语言把文件看作是一个字符(字节)的序列,即文件是由一个一个字符(字节)的数据顺序组成。
- 一个输入输出流就是一个字节流或二进制流。
2.文件的分类
根据数据的组织形式,数据文件可分为ASCII文件和二进制文件。
ASCII文件又称为文本文件。在这种文件中,每个字节存放一个字符的ASCII码值。
二进制文件中的数据与该数据在内存中的二进制形式是一致的,其中一个字节并不代表一个字符。
例:整数10000在内存中的存储形式以及分别按ASCII码形式和二进制形式输出如下图所示:
3.文件缓冲区
ANSI C标准采用“缓冲文件系统”处理文件, 是指系统自动地为正在被使用的文件在内存中开辟一个缓冲区。当需要向外存储器中的文件输出数据时,必须先将数据送到为该文件开辟的缓冲区中,当缓冲区满以后才一起送到外存储器中。当需要从外存储器中的文件读入数据进行处理时,也首先一次从外存储器将一批数据读入缓冲区(将缓冲区充满),然后再从缓冲区中将数据逐个读出进行处理。
由此可以看出,在缓冲文件系统中,对文件的输入输出是通过为该文件开辟的缓冲区进行的,对文件中数据的处理也是在该缓冲区中进行的。
4.文件指针
●在C语言的缓冲文件系统中,用文件类型指针来标识文件。
缓冲文件系统为每个被使用的文件都要在内存中开辟一个存储区,存放文件的有关信息(文件名、文件状态、文件当前位置等),这些信息用一个结构体变量保存,该结构体类型名为FILE。
程序是通过FILE结构体的指针来建立和文件的联系.也是利用FILE结构体指针进行文件的一切操作。
定义文件类型指针的一般形式为
FILE *指针变量名;
其中指针变量名用于指向一个文件,实际上是用于存放文件缓冲区的首地址。
5.文件的打开与关闭
FILE * fopen(const char *path, const char *mode);
r 只读 为输入打开一个文件。若指定的文件不存在,则返回
空指针值NULL。
w 只写 为输出建立一个新文件。若指定的文件已存在,则其
中原有内容被删去;否则创建一个新文件。
a 追加写 向文件尾增加数据。若指定的文件不存在,则创建
一个新文件。
r+ 读写 为读写打开一个文件。若指定的文件不存在,则返
回空指针值NULL。
w+ 读写 为读写打开一个新文件。若指定的文件已存在,则
其中内容被删去;否则创建一个新文件。
a+ 读与追加写 为读与向文件尾增加数据打开一个文件。
若指定的文件不存在,则创建一个新文件。
如果在后面附加“b”,则表示打开的是二进制文件,否则默认
为打开的是文本文件。
6.文件的关闭
int fclose(FILE *fp);
功能:是将由fp指向的缓冲区中的数据存放到外存文件中,然后释放该缓冲区。 当文件被关闭后,如果想再对该文件进行操作,则必须再打开它。虽然C语言允许打开多个文件,但打开的文件个数是有限的。
如果不关闭已经处理完的文件,当打开的文件个数很多时,会影响对其它文件的打开操作。因此,建议当一个文件使用完后应立即关闭它。
函数的返回值: 当顺利关闭后,返回值为0,否则返回EOF(-1).
7.向文件读写一个字符
用fputc函数向文件写入一个字符
int fputc(int c, FILE *fp);
用fgetc函数从文件读入一个字符
int fgetc(FILE *fp);
8.判文件结束函数feof()
在C语言中,只有文本文件才是以EOF作为文件结束标志的,而
二进制文件不是以EOF作为文件结束标志的。为此,C语言提供了一个
feof()函数,专门用来判断文件是否结束。
判文件结束函数的一般形式为 int feof(fp) 其中fp指向已打开的文件。
在读fp指向的文件时判断是否遇到文件结束。如果遇到文件结束,则函数feof(fp)的返回非零值;否则返回值为0。
feof()函数既可以用来判断二进制文件,也可以用来判断文本文件。
9.向文件读写一个字符串
● 读字符串函数 char *fgets(char *s, int size, FILE *fp);
其中fp为文件类型的指针,指向已打开的文件;是一个字符串指针;s用于存放从文件中读取的字符数据,size是一个整型变量,也可以是整型常量或整型表达式。
从指定的文件读入size-1个字符存放到由s指向的存储空间中,读入结束后,将自动在最后加一个字符串结束符‘\0’。如果成功返回s,否则返回 NULL
● 写字符串函数 int fputs(const char *s, FILE *fp);
其中fp为文件类型的指针,指向已打开的文件,s可以是一个字符串常量,也可以是一个指向字符串的指针,还可以是存放字符串的数组名。用于存放需要写入文件的字符数据。
将指定的字符串写到文件fp中。若写成功,则返回非负整数,否则返回EOF(-1)。
10.向文件读写一组数据
向文件读一组数据
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *fp);
其中:ptr 存放读入数据在内存的首地址。
size 每个数据项的字节数。 nmemb数据项个数。
fp 文件类型指针,指向已打开的文件
成功:返回实际读取的个数
到文件末尾返回 0
向文件写一组数据
size_t fwrite(const void *buf, size_t size, size_t count,FILE *fp);
其中:buf 输出数据的首地址。
size 每个数据项的字节数。
count 数据项个数。
fp 文件类型指针,指向已打开的文件。
成功:返回实际写入的字节数
到文件末尾返回 0
11.文件的随机读写
(1)用rewind()函数使位置指针指向文件头
void rewind(FILE *fp); 其中fp是已经打开的文件指针。
将文件的读写指针移动到文件的开头,此函数没有返回值。
(2)用fseek()函数移动位置指针
函数原型为 int fseek(FILE *fp, long offset, int whence);
调用形式为 fseek(文件指针,位移量,起始位置)
将文件的读写指针移动到指定的位置。
起始位置是指移动文件读写指针的参考位置,它有以下三个值:
SEEK_SET或0 表示文件头
SEEK_CUR或1 表示当前读写的位置
SEEK_END或2 表示文件尾
位移量是指以“起始位置”为基点,读写指针向文件尾方向移动的字
节数。这个参数的类型要求为长整型
返回值:成功返回 0 , 失败返回 -1
fseek(fp,100L,0);
将位置指针移到离文件头100个字节处
fseek(fp,50L, 1);
将位置指针移到离当前位置50个字节处
fseek(fp,-50L, 2);
将位置指针从文件末尾处向后退50个字节
(3)用ftell()函数测定位置指针的当前位置
long ftell(FILE *fp);
得到流式文件中的当前位置,用相对于文件开头的位移量来表示。
返回值:
返回当前位置,出错时返回-1L。
例:
i = ftell(fp);
将位置指针从文件末尾处向后退50个字节
(3)用ftell()函数测定位置指针的当前位置
long ftell(FILE *fp);
得到流式文件中的当前位置,用相对于文件开头的位移量来表示。
返回值:
返回当前位置,出错时返回-1L。
例:
i = ftell(fp);
if(i==-1L) printf(“error\n”);