c - 如何捕捉文件模式?

标签 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。

最佳答案

一般来说,在给定 FILE* 句柄的情况下,您无法使用可移植的 C 程序捕获 fopen 意义上的文件模式。

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

您应该采用定义和记录关于它们的约定

例如,在 Linux 上,套接字可能在操作系统级别是可读和可写的,并且您可以在其上有两个不同的 FILE* 句柄(使用 fdopen)对于读取和写入端。

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

所以一个假设的例程 fprint_stuff(FILE*, struct stuff_st*) 应该记录第一个参数是一个可写文件句柄,并且只会调用 fwrite fprintf 但应该检查它们是否失败。

关于c - 如何捕捉文件模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54421107/

相关文章:

c - 为什么我不必每次都返回 "average",然后再继续运行循环?

python - PyObject_Call 中没有错误的 NULL 结果

c - 跳入 C 中的一个 block

c - 将 "*()"作为参数传递给 bash 中的程序

linux - Linux/GCC 是否支持文件共享允许-拒绝类型?

c - F_SETPIPE_SZ 未声明

ios - 获取创建套接字的进程的 pid

c - 为什么我必须使用此代码输入 3 个值?

c++ - 无法使用 read() 将文件内容读入缓冲区