【问题标题】:How to catch file mode?如何捕捉文件模式?
【发布时间】:2019-01-29 20:54:30
【问题描述】:

我必须捕捉以下模式:

"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。

【问题讨论】:

  • 你得到 32768,即__O_LARGEFILE|O_RDONLY
  • 这肯定看起来像XY problem。原始文件模式将解决什么实际问题?并且不知道文件以什么模式打开 - 由您自己的进程 - 有一个非常讨厌的code smell
  • 如果意图是assert( myfileisreadable( f ) ),这不是讨厌的代码。它不是用于生产代码,而是用于测试代码以帮助检测错误。这就是assert的目的...

标签: c fcntl


【解决方案1】:

一般来说,您无法使用可移植的 C 程序捕获 -given a FILE* handle-,即 fopen 意义上的文件模式。

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

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

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

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

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

【讨论】:

  • 写像my_open(struct my_file*, const char *filename, const char *mode);这样的函数可能更好?
  • 为什么?您想利用FILE*,但您需要记录有关如何使用它的约定
猜你喜欢
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 2018-10-13
  • 2019-03-01
相关资源
最近更新 更多