有没有办法判断 aFILE *
打开了什么模式?
具体来说,我需要判断文件流是否可写。要么只是它是否可写的真/假结果,要么是const char *
模式本身的好。
不直接回答您的问题,但您可以使用freopen
FILE *freopen(const char *path, const char *mode, FILE *stream);
它在指定的流上打开指定的文件,如果流已经打开,则首先关闭它。如果流之前有一个方向,freopen
则清除它。
是的,有一些方法,但它们本质上是历史性的,并且被其他人不赞成。此外,您将需要研究/测试确切的值是什么,然后冒着新版本的操作系统将撤销您的假设的风险。
无论如何,鉴于该警告,您可以测试 FILE 结构内的字段以获取特定值。该结构在 stdio.h 中,感兴趣的字段是:_flag 和 _file。
编写一些特征代码并在您的系统上运行,如下所示:
#include <stdio.h>
main()
{
FILE *fp;
fp = fopen("test1.txt", "r");
printf("(r) _flag = %04x, _file = %04x\n", fp->_flag, fp->_file);
fp = fopen("test2.txt", "a");
printf("(a) _flag = %04x, _file = %04x\n", fp->_flag, fp->_file);
fp = fopen("test3.txt", "w");
printf("(w) _flag = %04x, _file = %04x\n", fp->_flag, fp->_file);
}
您可以看到与每种打开类型关联的 _flag 值。
在 Windows/XP 上,我得到以下信息:
(r) _flag = 0001, _file = 0003
(a) _flag = 0002, _file = 0004
(w) _flag = 0002, _file = 0005
注意,append 和 write 是一样的!_file 值似乎是 _iob 的索引,其中标准输入为 _file = 0000。
无论如何,乱来,实验。尝试从文件中写入/读取数据,看看 _flag 是否改变???
一般来说,没有。您需要自己跟踪这些信息。您可能可以尝试写入文件并获得错误或成功,但这完全取决于您要执行的操作。
FILE * f;
//...
if (f->flags == 2 || f->flags == 3) {
// writable
}