Linux fopen/freopen/fdopen 函数

Linux 同时被 2 个专栏收录
36 篇文章 0 订阅
36 篇文章 0 订阅

一、函数声明

#include <stdio.h>

FILE *fopen(const char *pathname, const char *mode);
// 从文件描述符创建并关联一个FILE.
FILE *fdopen(int fd, const char *mode);
// freopen,重新打开文件,并清除原来的定向(字节流定向,宽字节流定向)
FILE *freopen(const char *pathname, const char *mode, FILE *stream);

fdopen,该函数与fopen的区别在于,fdopen可以支持任何类型的文件的描述符
但是fopen支持的相对少一些,fopen不支持管道,socket的文件直接打开。

二、实例

2.1 fopen

// fopen版本
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc, char **args)
{
    FILE *pf;
    char buf[4096] = {0};
    
    pf = fopen("hotice0", "r");
    if (!pf) {
        perror("fopen");
        exit(EXIT_FAILURE);
    }

    fscanf(pf, "%s", buf);

    printf("%s\n", buf);

    fclose(pf);
    return EXIT_SUCCESS;
}

2.2 fopen运行结果

hotice0@ubuntu:~/Documents/Unix_Program$ cat hotice0 
testhotice0@ubuntu:~/Documents/Unix_Program$ ./fopen 
test

2.3 fdopen

#ifndef __USE_POSIX
#define __USE_POSIX
#endif

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc, char **args)
{
    FILE *pf;
    int fd;
    char buf[4096] = {0};
    
    fd = open("hotice0", O_RDONLY);
    if (fd < 0) {
        perror("open");
        exit(EXIT_FAILURE);
    }
    pf = fdopen(fd, "r");
    // pf = fopen("hotice0", "r");
    if (!pf) {
        perror("fopen");
        close(fd);
        exit(EXIT_FAILURE);
    }

    fscanf(pf, "%s", buf);

    printf("%s\n", buf);

    fclose(pf);
    return EXIT_SUCCESS;
}

2.4 运行结果

与上面fopen结果一致

hotice0@ubuntu:~/Documents/Unix_Program$ cat hotice0 
testhotice0@ubuntu:~/Documents/Unix_Program$ ./fopen 
test

2.5 fclose会关闭文件句柄?

我们在fclose之后,调用read进行读取看看

#ifndef __USE_POSIX
#define __USE_POSIX
#endif

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc, char **args)
{
    FILE *pf;
    int fd;
    char buf[4096] = {0};
    
    fd = open("hotice0", O_RDONLY);
    if (fd < 0) {
        perror("open");
        exit(EXIT_FAILURE);
    }
    pf = fdopen(fd, "r");
    // pf = fopen("hotice0", "r");
    if (!pf) {
        perror("fopen");
        close(fd);
        exit(EXIT_FAILURE);
    }

    fscanf(pf, "%s", buf);

    printf("%s\n", buf);

    fclose(pf);

    if (read(fd, buf, 4096) < 0) {
        perror("read");
        exit(EXIT_FAILURE);
    }
    return EXIT_SUCCESS;
}

2.6 运行结果

test
read: Bad file descriptor

可以看到fclose不仅释放了缓存(即标准IO相关),还关闭了文件描述符。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 终极编程指南 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值