APUE编程:03---标准I/O库之(流的打开与关闭:fopen()、freopen()、fdopen()、fclose())

一、流的打开

#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

  • 功能:打开路径名由pathname指示的一个文件

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流都被关闭
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董哥的黑板报

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值