确定FILE *是否可写

时间:2013-08-31 02:14:33

标签: c file

有没有办法告诉FILE *打开了什么模式?

具体来说,我需要告诉文件流是否可写。只是它是否可写的真/假结果,或模式本身的const char *是好的。

4 个答案:

答案 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
}