![e13beaae13cba86be8e7c473e87f59c2.png](https://i-blog.csdnimg.cn/blog_migrate/598886d2a06f71f0a09c9380f2f60f16.jpeg)
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](https://i-blog.csdnimg.cn/blog_migrate/862af6b17cb2114b2ae6ef53e910d8a8.jpeg)
总结
- r代表只读,若文件不存在则报错。
- w代表只写,并且文件若存在则将其清空,若不存在则创建
- a代表追加,并且文件若存在则继续写,若不存在则创建
- 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](https://i-blog.csdnimg.cn/blog_migrate/c947d347d57c57809c6b0bbe9362c733.jpeg)
打开文件的数量上限
#include
解释: 在这里不断创建文件,直到达到文件数量上限时给出break,输出创建文件数量
输出:
![db49c76eeef6d083b4a6a1924c6e8f2b.png](https://i-blog.csdnimg.cn/blog_migrate/2fd0df9c3b83e88c3ce5eeda7909070f.png)
和
![5ed88afd054dc1da5974c12f28aebbb8.png](https://i-blog.csdnimg.cn/blog_migrate/9d3a0ed4e6e601e06ff7dc3a090f8327.jpeg)
给出的限制是相同的。因为自动打开的流为stdin,stdout,stderr,因此剩余256-3=253