zoukankan      html  css  js  c++  java
  • fdopen[转]

    fopen()、fdopen()、close()
    2010年01月03日 星期日 12:58

    Linux环境下可以使用下列函数打开一个流,其函数原型如下:
    #include <stdio.h>
    FILE * fopen(const char * restrict pathname,
    const char * restrict type);
    FILE * fdopen(int filedes, const char *type);
    fopen函数的第1个参数表示需要打开文件的路径,第2个参数type表示打开的方式,该值以一个字符串的形式传入,
    type 字串中包含字母a的表示"追加写",即流打开以后,文件的读写位置在文件的末尾,所以成为追加写;type字串中包括字母b的表示流以二进制文件的形式打 开,其他的则表示流以文本文件的形式打开。这一点对于Linux系统来讲没有意义,因为Linux系统下的二进制文件和文本文件都是普通文件,是字节流, 内核并不区分这二者。
    如果成功打开流,fopen函数返回一个FILE对象的指针,用户可以使用该指针操作这个流;如果失败则返回NULL,并且设置errno错误号。一般来讲,fopen函数是很少出错的,其原因主要有以下3种。
    指定的文件路径有问题。type参数是一个非法字符串。文件的操作权限不够。
    fdopen 函数用于在一个已经打开的文件描述符上打开一个流,其第1个参数表示一个已经打开的文件描述符,第2个参数type的意义和fopen函数的第2个参数一 样。只有一点不同的是,由于文件已经被打开,所以fdopen函数不会创建文件,而且也不会将文件截短为0,这一点要特别注意。这两步操作在打开该文件描 述符的时候已经完成。
    Linux环境下使用fclose函数关闭一个流,其函数原型如下:
    #include <stdio.h>
    int fclose(FILE *fp);
    fclose函数的参数是一个FILE对象的指针,它指向需要关闭的流。如果关闭成功,fclose函数返回0,失败返回EOF。这个值是一个定义在stdio.h文件中的宏,其值是-1。
    下面实例演示了打开和关闭一个流。
    (1)在vi编辑器中编辑该程序如下:
    程序清单21-2 stream.c 打开并关闭一个流
    #include <stdio.h>
    #include <fcntl.h>
    int main(void)
    {
    FILE *fp;
    int fd;
    if( (fp = fopen("test.txt", "r+")) == NULL){ /* 以读写方式打开流 */
    perror("fail to open");
    exit(1);
    }
    fprintf(fp, "hello world/n"); /* 向该流输出一段信息,这段信息会反馈到文件上 */
    fclose(fp);      /* 关闭流 */
    if( (fd = open("test.txt", O_RDWR) == -1){ /* 以读写的方式打开文件 */
    perror("fail to open");
    exit(1);
    }
    if((fp = fdopen(fd, "r+") == NULL){ /* 在打开的文件上打开一个流 */
    perror("fail to open stream");
    exit(1);
    }
    fprintf("hello world again/n");
    fclose(fp);     /* 关闭流,文件也被关闭 */
    return 0;
    }
    (2)在shell中编译该程序如下:
    $gcc stream.c -o stream
    (3)在shell中运行该程序如下:
    $./stream
    (4)打开test.txt文件,可以见到文件内有以下信息。
    $cat test.txt
    hello world
    hello world again

  • 相关阅读:
    springMVC:HandlerInterceptor拦截器的使用
    SpringMVC:JSON形式输出(基于Fastjson)
    Callable接口解析
    FastJson一些常见方法(API):处理JSON变得好简单
    Spring@Autowired注解
    一些错误和解决办法--01
    线程池的原理及实现
    Rotate Image(二位数组顺时针旋转)
    JAVA内部类
    jdk9模块化--特性
  • 原文地址:https://www.cnblogs.com/ymy124/p/2352585.html
Copyright © 2011-2022 走看看