有没有办法告诉FILE *
打开了什么模式?
具体来说,我需要告诉文件流是否可写。只是它是否可写的真/假结果,或模式本身的const char *
是好的。
答案 0 :(得分:3)
不直接回答您的问题,但您可以使用freopen
FILE *freopen(const char *path, const char *mode, FILE *stream);
它会在指定的流上打开指定的文件,如果已经存在,则首先关闭该流
打开。如果流先前有方向,freopen
将其清除。
答案 1 :(得分:3)
无论如何,考虑到这一点,您可以在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
注意,追加和写一样! _file值似乎是_iob的索引,其中stdin是_file = 0000。
无论如何,乱七八糟,试验。尝试从文件中写入/读取数据,看看_flag是否会改变???
答案 2 :(得分:2)
一般情况下,没有。您需要自己跟踪这些信息。您可能能够尝试写入该文件并获得错误或成功,但这取决于您正在尝试做什么。
答案 3 :(得分:0)
FILE * f;
//...
if (f->flags == 2 || f->flags == 3) {
// writable
}