dup2函数_UNIX环境高级编程(APUE)学习之路第5章-5.2 fopen函数和fclose函数

e13beaae13cba86be8e7c473e87f59c2.png

fopen系列函数

下列3个函数打开一个标准I/O流。

#include 

函数区别如下

fopen

fopen 函数打开路径名为pathname的一个指定的文件。

freopen

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

fdopen

fdopen函数取一个已有的文件描述符(我们可能从open、dup、dup2、fcntl、pip、socket、socketpair或accept函数得到此文件描述符),并使一个标准的I/O流与该描述符相结合。此函数常用与创建管道和网络通信通道函数返回的描述符。因为这些特殊类型的文件不能用标准I/O函数fopen打开,所以我们必须先调用设备专用函数以获得一个文件描述符,然后用fdopen使一个标准I/O流与该描述符相结合。

参数

1.pathname

路径名,const修饰表明不会对传输的参数做任何修改。

2.type

权限

554ea6f296a1797b8d0337e74315262b.png

总结

  1. r代表只读,若文件不存在则报错。
  2. w代表只写,并且文件若存在则将其清空,若不存在则创建
  3. a代表追加,并且文件若存在则继续写,若不存在则创建
  4. a+模式则较为特殊,若是读操作则放开头,写操作则放在结尾。

注意

在UNIX中,b这个字符无关紧要,也就是说r和rb含义相同。

返回值

返回值是一个指向FILE结构体的指针,FILE结构体在上一节中给出了介绍,那么这个指针的指向位置是在哪呢? 答案: 堆上。

解释: 存放位置有三个可能性:栈、静态区和堆

而函数的形式如下:

FILE 

可以看到,若是栈,那么意味着是局部变量,在函数调用结束之后就被销毁了,因此不可能是栈。

那么若是静态区,则需要在函数体中

static 

但是对于static修饰的变量只能声明一次,也就是说,以后再调用fopen函数时不会重新static定义一个变量了,只会返回相同的变量。 因此只能在堆上。 也就是需要在定义时就先分配一定空间,如下:

FILE 

fclose函数

fclose函数作用于fopen相反

注意

fopen里有malloc函数,因为在fclose里面需要free。这是成对出现的

函数形式

#include 

返回值

若成功返回0,若失败返回EOF(一般是-1,但是为了严谨需要使用EOF)

动作

在该文件被关闭之前,冲洗缓冲区中的输出数据。缓冲区中的任何输入数据被丢弃。如果标准I/O库已经为该流自动分配了一个缓冲区,则释放此缓冲区 当一个进程正常终止时,则所有带未写缓冲数据的标准I/O流都被冲洗,所有打开的标准I/O流都被关闭。

fopen和fclose举例

#include 

解释:在这里以写的形式打开一个叫tmp的文件,因为文件不存在,因此创建了该文件,并且输出OK,最终调用dclose关闭流

输出:

cc8552656e0510e950fc2330de1fa0c9.png

打开文件的数量上限

#include 

解释: 在这里不断创建文件,直到达到文件数量上限时给出break,输出创建文件数量

输出:

db49c76eeef6d083b4a6a1924c6e8f2b.png

5ed88afd054dc1da5974c12f28aebbb8.png

给出的限制是相同的。因为自动打开的流为stdin,stdout,stderr,因此剩余256-3=253

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值