【问题标题】:How to check if an opened file is in read mode or write mode?如何检查打开的文件是处于读取模式还是写入模式?
【发布时间】:2016-05-21 15:37:26
【问题描述】:

如何检查打开的文件是处于读模式还是写模式,即“r”或“w”?

请注意,该文件是使用fopen 命令打开的,并且必须以标准方式而不是特定于平台的 hack。

编辑 1:

似乎FILE 数据结构是依赖于实现的。获得它的唯一方法必须是在 FILE.flags 变量中,但是在我的 Mingw32 中,它只有 FILE._flags

【问题讨论】:

  • 听起来您对更好的解决方案有疑问。你从哪里得到文件?该代码也可以通过模式吗?
  • @Dani 我知道我有一个更好的解决方案,只需在我的结构中打开模式时存储它。但由于 FILE 是基于状态的,它必须在某处存储该信息。
  • 您总是可以尝试备份 1 个字符,读取该字符,保存它,再次备份并尝试写入它。我还没有尝试过,但我想到了。
  • @smlq: FILE 界面中没有任何东西需要保存模式,它可以将它传递给操作系统并忘记它。
  • @smlq 在这种情况下,正如您所发现的那样,唯一可移植的方法就是自己存储信息。我希望为您提供更好的解决方案,但在这种情况下,这确实是唯一可以接受的答案。

标签: c file


【解决方案1】:

通过fcntl调用可以获得文件描述符访问模式。

但是,如果您使用 fopen()(它返回 FILE* 而不是整数文件描述符),则需要先获取文件描述符。

您可以为此使用int fileno(FILE *stream)。请记住,这不是 C 标准,而是 POSIX 标准。

编辑:肮脏的例子:

FILE *file = fopen("/home/zeta/a.c", "r");
int fd = fileno(file);
int mode = fcntl(fd, F_GETFL);

手册页包含您需要了解的有关 fcntl 的所有信息:

http://man7.org/linux/man-pages/man2/fcntl.2.html

【讨论】:

  • 如果您提供对 fcntl 及其参数的调用会很有帮助。
  • @EzequielGarcía:谢谢!但是你对 msvc 有什么提示吗?
  • @smlq 不。在我看来,您应该只跟踪程序中的访问模式,不要担心。此外,获取这些信息会更便宜。在我提供的示例中,获取访问模式会导致系统调用,这意味着将需要上下文切换,只是为了获取这一微小的信息。在我看来,将访问模式与 FILE* 一起存储更快、更简单、更便携。
  • 你如何解释你在mode 中得到的结果在可用模式方面,“r”、“r+”、“w”、“w+”、“a”、“a+” “?
  • @sancho.sReinstateMonicaCellio 我认为它们的映射非常好,请查看 open、fopen 和 fcntl 手册页。例如。是 F_GETFL 返回 O_RDWR 那么它应该是“r+”。或许你可以做一些实验来确认。
【解决方案2】:

正如 Ezequiel Garcia 所说,每个FILE 都有一个关联的文件描述符,您可以使用以下命令查询文件描述符的模式

const int word = fcntl(fd, F_GETFL);

现在的重点是如何从word 进入开启模式。 那是问题的主题 How to get the mode of a file descriptor?

我花了一些时间询问、修补和学习才到达the answer,这留下了一些有趣的问题,并且手册页与实验所获得的结果之间存在很大差距。

我建议您尝试在您的系统 (mingw32) 中使用我发布的代码,看看它会产生什么结果。它将帮助您编写(更多)可移植代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 2014-07-13
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多