下列三个函数打开一个标准I/O流。
- #include <stdio.h>
- FILE *fopen(const char *restrict pathname, const char *restrict type);
- FILE *fropen(const char *restrict pathname, const char *restrict type, FILE *restrict fp);
- FILE *fdopen(int filedes, const char *type);
返回值:成功返回文件指针,出错返回NULL
fopen打开一个指定的文件。
freopen在一个指定的流上打开一个指定的文件,如若该流已经打开,则先关闭流。若该流已经定向,则freopen清除该定向。此函数一般用于将一个指定的文件打开为一个预定义的流:标准输入、标准输出或标准出错。
fdopen获取一个现有的文件描述符,并使一个标准的I/O流与该描述符相结合。此函数常用于由创建管道和网络通信通道函数返回的描述符。因为这些特殊类型的文件不能用标准I/O fopen函数打开,所以必须先调用设备专用函数以获得一个文件描述符,然后用fdopen使一个标准I/O流与该描述符相关联。
fopen和freopen是ISO C的所属部分。而ISO C并不涉及文件描述符,所以仅有POSIX.1具有fdopen。
type参数质的个对该I/O流的读、写方式,ISO C规定type参数可以有15种不同的值,它们示于表5.2中。
type |
Description |
---|---|
r or rb |
open for reading |
w or wb |
truncate to 0 length or create for writing |
a or ab |
append; open for writing at end of file, or create for writing |
r+ or r+b or rb+ |
open for reading and writing |
w+ or w+b or wb+ |
truncate to 0 length or create for reading and writing |
a+ or a+b or ab+ |
open or create for reading and writing at end of file |
表5.2 打开标准I/O流的type参数
对于fdopen,type参数的意义稍有区别。因为该描述符已被打开,所以fdopen为写而打开并不截短该文件。
当以读和写类型打开一个文件时(type+符号),具有下列限制:
- 如果中间没有fflush、fseek、fsetpos或rewind,则在输出的后面不能直接跟随输入。
- 如果中间没有fseek、fsetpos或rewind,或者一个输入操作没有到达文件尾端,则在输入操作之后不能直接跟随输出。
Restriction |
r |
w |
a |
r+ |
w+ |
a+ |
---|---|---|---|---|---|---|
file must already exist |
• |
• |
||||
previous contents of file discarded |
• |
• |
||||
stream can be read |
• |
• |
• |
• |
||
stream can be written |
• |
• |
• |
• |
• |
|
stream can be written only at end |
• |
• |
表5.3 打开一个标准I/O流的6种不同的方式
注意,在指定w或a类型创建一个新文件时,我们无法说明该文件的访问权限位。除非引用终端设备,否则按系统默认的情况,流被打开时是全缓冲的。若流引用终端设备,则该流是行缓冲的。一旦打开了流,那么在对该流执行任何操作之前,如果希望,则可使用上一节所述的setbuf和setvbuf改变缓冲的类型。
调用fclose关闭一个打开的流。
- #include <stdio.h>
- int fclose(FILE *fp);
返回值:成功返回0,出错返回EOF
在该文件被关闭之前,冲洗缓冲区中的输出数据。丢弃缓冲区中的任何输入数据。
当一个进程正常终止时(直接调用exit函数,或从main函数返回),则所有带未写缓冲数据的标准I/O流都会被冲洗,所有打开的标准I/O溜溜都会被关闭。