一、流的打开
#include <stdio.h>
FILE *fopen(const char *restrict pathname, const char *restrict type);
FILE *freopen(const char *restrict pathname, const char *restrict type, FILE *restrict fp);
FILE *fdopen(int fd, const char *type);
//返回值:若成功则为文件指针,若出错则为NULL
fopen
freopen
- 功能:在一个特定的流上(由fp指示)打开一个指定的文件(其路径名由pathname指示)
- 如若该流已经打开,则先关闭该流
- 如果该流已经重定向,则清除该定向
- 此函数一般用于将一个指定的文件打开为一个预定义的流: 标准输入、标准输出或标准出错
fdopen
- 功能:取一个现存的文件描述符(我们可能从open、dup、dup2、fcntl、pipe、socket、socketpair、accept函数得到此文件描述符),并使一个标准的I/O流与该描述符相结合
- 此函数常用于由创建管道和网络通信通道函数返回的描述符。因为这些特殊类型的文件不能用标准I/O函数fopen打开,首先必须先调用设备专用函数以获得一个文件描述符,然后用fdopen使一个标准I/O流与该描述符相结合
type参数
- type参数指定该I/O流的读、写方式,ISO C规定type参数可以有15种不同的值,如下所示:
- 字符b的注意事项:
- 使用字符b作为type的一部分,使得标准I/O系统可以区分文本文件和二进制文件
- 但是UNIX内核并不对这两种文件进行区分,所以在UNIX系统环境下指定字符b作为type的一部分实际上并无作用
- 对于fdopen,type参数的意义则稍有区别:
- 因为参数fd所指的描述符已被打开,所以fdopen为写而打开并不截断该文件。例如,若参数fd所指的描述符原来是由open函数打开的,该文件那时已经存在,则其O_TRUNC标志将决定是否截短该文件。fdopen函数不能截断它为写而打开的任一文件
- 另外,标准I/O追加方式也不能用于创建该文件(因为如果一个描述符引用一个文件,则该文件一定已经存在)
- 当以读和写类型打开一个文件时(type中+号),具有下列限制:
- 如果中间没有fflush、fseek、fsetpos、rewind,则在输出的后面不能直接跟随输入
- 如果中间没有fseek、fsetpos、rewind,或者一个输出操作没有到达文件尾端,则在输入操 作之后不能直接跟随输出
- 对应于上图,下图列出了打开一个流的6种不同的方式:
二、流的关闭
#include <stdio.h>
int fclose(FILE *fp);
//返回值:若成功则为0,若出错则为EOF
- 功能:调用该函数来关闭一个打开的流
- 关闭的特点:
- 在该文件被关闭之前,刷新缓存中的输出数据。缓存中的输入数据被丢弃
- 如果标准I/O库已经为该流自动分配了一个缓存,则释放此缓存
- 注意事项:当一个进程正常终止时(直接调用exit函数,或从main函数返回),则所有带未写缓存数据的标准I/O流都被刷新,所有打开的标准I/O流都被关闭