5.5 打开流

5.5 打开流

下列三个函数打开一个标准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

1.     fopen打开一个指定的文件。

2.     freopen在一个指定的流上打开一个指定的文件,如若该流已经打开,则先关闭流。若该流已经定向,则freopen清除该定向。此函数一般用于将一个指定的文件打开为一个预定义的流:标准输入、标准输出或标准出错。

3.     fdopen获取一个现有的文件描述符,并使一个标准的I/O流与该描述符相结合。此函数常用于由创建管道和网络通信通道函数返回的描述符。因为这些特殊类型的文件不能用标准I/O fopen函数打开,所以必须先调用设备专用函数以获得一个文件描述符,然后用fdopen使一个标准I/O流与该描述符相关联。

fopenfreopenISO C的所属部分。而ISO C并不涉及文件描述符,所以仅有POSIX.1具有fdopen

type参数指定对该I/O流的读、写方式,ISO C规定type参数可以有15种不同的值,它们示于表5.2中。

type

Description

r rb

open for reading

wwb

truncate to 0 length or create for writing

aab

append; open for writing at end of file, or create for writing

r+r+brb+

open for reading and writing

w+w+bwb+

truncate to 0 length or create for reading and writing

a+a+bab+

open or create for reading and writing at end of file

5.2 打开标准I/O流的type参数

对于fdopentype参数的意义稍有区别。因为该描述符已被打开,所以fdopen为写而打开并不截短该文件。

当以读和写类型打开一个文件时(type+符号),具有下列限制:

·         如果中间没有fflushfseekfsetposrewind,则在输出的后面不能直接跟随输入。

·         如果中间没有fseekfsetposrewind,或者一个输入操作没有到达文件尾端,则在输入操作之后不能直接跟随输出。

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种不同的方式

注意,在指定wa类型创建一个新文件时,我们无法说明该文件的访问权限位。除非引用终端设备,否则按系统默认的情况,流被打开时是全缓冲的。若流引用终端设备,则该流是行缓冲的。一旦打开了流,那么在对该流执行任何操作之前,如果希望,则可使用上一节所述的setbufsetvbuf改变缓冲的类型。

调用fclose关闭一个打开的流。

·         #include <stdio.h>

· int fclose(FILE *fp);

返回值:成功返回0,出错返回EOF

在该文件被关闭之前,冲洗缓冲区中的输出数据。丢弃缓冲区中的任何输入数据。

当一个进程正常终止时(直接调用exit函数,或从main函数返回),则所有带未写缓冲数据的标准I/O流都会被冲洗,所有打开的标准I/O溜溜都会被关闭。

原文地址:https://www.cnblogs.com/shaoguangleo/p/2805981.html