5.5 标准I/O库_打开流

时间:2021-02-10 14:19:29

    下列三个函数打开一个标准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溜溜都会被关闭。