如何捕捉文件模式?

时间:2019-01-29 12:30:35

标签: c fcntl

我必须捕捉以下模式:

"rb""r+b""wb"

我试图执行以下代码(编译):

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
    FILE *file = fopen("data.bin", "r");
    if (!file){
        perror("");
        return -1;
    }

    int fd = fileno(file);
    if (fcntl(fd, F_GETFL) == O_RDONLY){
        printf("read only\n");
    }

    // printf("%d\n", O_APPEND);

    fclose(file);
    return 0;
}

但是什么也没印出来。 fcntl()返回整数,例如32768,但是我需要来自库的宏,例如O_RDONLY。

1 个答案:

答案 0 :(得分:3)

通常,使用可移植的C程序无法捕获FILE*赋予的文件模式fopen

例如,您的FILE*可以通过popenfmemopenopen_memstreamfdopen等获得,并且只能是可写的或仅可读。它甚至可能没有fileno给出的有效文件描述符。

您应该采用以及定义和文档约定

例如,在Linux上,套接字在OS级别上是可读写的,并且您可以在其上有两个不同的FILE*句柄(使用fdopen)以进行读取和写入双方。

当然,在FILE*(或fclose)之后,pclose句柄不可用

因此,假设例程fprint_stuff(FILE*, struct stuff_st*)应该记录第一个参数是可写文件句柄,并且只调用fwritefprintf,但应检查这些都没有失败。