下列3个函数可以用来打开一个标准I/O流
#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);
3个函数的返回值:若成功,返回文件指针;若出错,返回NULL这三个函数的区别如下:
(1)fopen函数打开路径名为pathname的一个指定的文件。
(2)freopen函数在一个指定的流上打开一个指定的文件,如若该流已经打开,则先关闭该流。若该流已经定向,则使用freopen清除该定向。此函数一般用于讲一个指定的文件打开为一个预定义的流;标准输入、标准输出或者标准错误。
(3)fdopen函数去一个已有的文件描述符(可能从open dup dup2 fcntl pipe socket socketpair accept),并使用一个标准的I/O流与该描述符相结合。西函数常用于创建管道和网络通信函数返回的描述符。因为这些特殊类型的文件不能用标准I/O函数fopen打开,所以我们必须先调用设备专用函数一伙的一个文件描述符,然后用fdopen使一个标准I/O流与该描述符相结合。
type参数指定对该I/O流的读,写方式,type参数可以有15种不同的值。
| type | 说明 | open标志 |
| r或rb | 为读打开 | O_RDONLY |
| w或wb | 把文件截断至0长,或为写而创建 | O_WRONLY|O_CREAT|O_TRUNC |
| a或ab | 追加,为在文件尾写而打开,或为写而创建 | O_WRONLY|O_CREAT|O_APPEND |
| r+或r+b或rb+ | 为读和写而打开 | O_RDWR |
| w+或w+b或wb+ | 把文件截断至0长,或为读和写而打开 | O_RDWR|O_CREAT|O_TRUNC |
| a+或a+b或ab+ | 为在文件尾读和写而打开或创建 | O_RDWR|O_CREAT|O_APPEND |
使用字符b作为type的一部分,这使得标准I/O系统可以区分文本和二进制文件。因为UNIX并不对这两种文件进行区分,所以在UNIX系统环境下指定字符b作为type的一部分实际上并无作用。
当以读或写打开一个文件时,具有下列限制。
若果中间没有fflush fseek fsetpos rewind,则在输出的后面不能直接跟随输入。
如果中间没有fseek fsetpos rewind,或者一个输入操作没有到达文件尾端,则在输入操作之后不能直接跟随输出。
| 限制 | R | W | a | r+ | w+ | a+ |
| 文件必须已存在 放弃文件以前的内容 | * | * | * | * | ||
| 流可以读 流可以写 流只可在尾端处写 | * | * | * * | * * | * * | * * * |
除非流引用终端设备,否则按系统默认,流被打开时是全缓冲的。若流引用终端设备,则流是行缓冲的。一个打开了流,那么在对该流执行任何操作之前,如果希望,则可使用setbuf或setvbuf改变缓冲的类型。
2333

被折叠的 条评论
为什么被折叠?



