【问题标题】:How to fdopen as open with the same mode and flags?如何使用相同的模式和标志打开 fdopen?
【发布时间】:2013-02-27 11:13:06
【问题描述】:

我想要一个FILE* 类型来使用fprintf。 我需要使用fdopen 来获取FILE* 而不是返回intopen。 但是我们可以对fdopenopen 做同样的事情吗? (我没用过fdopen

我想做一个fdopen,它与:

open("my_file", 0_CREAT | O_RDWR | O_TRUNC, 0644);

【问题讨论】:

    标签: c file-io printf fdopen


    【解决方案1】:

    fdopen 采用以前可能由open 返回的文件描述符,所以这不是问题。

    只需 open 你的文件获取描述符,然后 fdopen 那个描述符。

    fdopen 只是创建一个用户空间缓冲流,采用支持readwrite 操作的任何类型的描述符。

    【讨论】:

    • 不要忘记fdopen 的模式必须与文件描述符的模式兼容。
    【解决方案2】:

    fdopen()使用文件描述符指向文件指针:

    fdopen() 函数将流与文件描述符相关联。文件描述符从open()dup()creat()pipe() 获得,它们打开文件但不返回指向FILE 结构流的指针。流是几乎所有 stdio 库例程的必要输入。

    FILE* fp = fdopen(fd, "w");
    

    此示例代码可能会在您想使用fprintf()时为您提供更多帮助:

    int main(){
     int fd;
     FILE *fp;
     fd = open("my_file",O_WRONLY | O_CREAT | O_TRUNC);
      if(fd<0){
        printf("open call fail");
        return -1;
     }
     fp=fdopen(fd,"w");
     fprintf(fp,"we got file pointer fp bu using File descriptor fd");
     fclose(fp);
     return 0;
    }
    

    注意:

    【讨论】:

    • 你应该在使用fdopen然后fclose之后关闭文件描述符。 fd 没有被复制,调用 fclose 将关闭它。
    • 引用手册页:The file descriptor is not dup'ed, and will be closed when the stream created by fdopen() is closed. 另见stackoverflow.com/questions/8417123/…
    • 这不会在文件中写入任何内容。
    • @Elfayer 它应该可以工作,再试一次这里还有一个example
    【解决方案3】:

    如果您之前没有为您的文件获取文件描述符,请使用fopen

    FILE* file = fopen("pathtoyourfile", "w+");
    

    请考虑,fopen 使用的是标准库调用而不是系统调用(打开)。所以你没有那么多选择(比如指定访问控制值)。

    请参阅man-page

    【讨论】:

      猜你喜欢
      • 2013-09-22
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多