5

有没有办法判断 aFILE *打开了什么模式?

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

4

4 回答 4

3

不直接回答您的问题,但您可以使用freopen

FILE *freopen(const char *path, const char *mode, FILE *stream);

它在指定的流上打开指定的文件,如果流已经打开,则首先关闭它。如果流之前有一个方向,freopen则清除它。

于 2013-08-31T02:21:34.327 回答
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

注意,append 和 write 是一样的!_file 值似乎是 _iob 的索引,其中标准输入为 _file = 0000。

无论如何,乱来,实验。尝试从文件中写入/读取数据,看看 _flag 是否改变???

于 2013-08-31T02:48:40.213 回答
2

一般来说,没有。您需要自己跟踪这些信息。您可能可以尝试写入文件并获得错误或成功,但这完全取决于您要执行的操作。

于 2013-08-31T02:17:38.610 回答
0
FILE * f;
//...
if (f->flags == 2 || f->flags == 3) {
     // writable
}
于 2013-08-31T02:52:28.343 回答