如何检查打开的文件是处于读取模式还是写入模式?

时间:2016-05-21 15:37:26

标签: c file

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

请注意,该文件是使用MultiplesOfThreeAndFive命令打开的,它必须采用标准方式,而不是特定于平台的黑客攻击。

编辑1:

fopen数据结构似乎与实现有关。获取它的唯一方法必须是FILE变量,但在我的Mingw32中,它只有FILE.flags

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

const int word = fcntl(fd, F_GETFL);

现在的关键是如何从word进入打开模式。 那是个问题 How to get the mode of a file descriptor?

我花了一些时间询问,修修补补和学习到the answer,这留下了一些有趣的问题,手册页与实验内容之间存在很大的差距。

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