我可以获得`FILE*`的访问模式吗?

zne*_*eak 6 c macos file-io posix

我不得不FILE*在Mac OS X上复制一个C(一直使用POSIX int文件描述符是不可能的),所以我想出了以下函数:

static FILE* fdup(FILE* fp, const char* mode)
{
    int fd = fileno(fp);
    int duplicated = dup(fd);
    return fdopen(duplicated, mode);
}
Run Code Online (Sandbox Code Playgroud)

它工作得很好,除了它有一个小丑陋的部分,我再次要求文件模式,因为fdopen显然无法自己确定它.

这个问题并不重要,因为基本上,我只是用它stdin,stdout而且stderr(显然我知道这三种的访问模式).但是,如果我不必亲自了解它,它更优雅; 这可能是因为dup呼叫不需要它.

如何确定FILE*流的访问模式?

R..*_*R.. 7

您不能,但您可以确定基础文件描述符的模式:

int fd = fileno(f);
int accmode = fcntl(fd, F_GETFL) & O_ACCMODE;
Run Code Online (Sandbox Code Playgroud)

然后,您可以fdopen根据accmode是,还是O_RDONLY,选择适当的模式进行传递.O_WRONLYO_RDWR