【问题标题】:FILE* that goes nowhereFILE* 无处可去
【发布时间】:2010-12-26 02:24:19
【问题描述】:

有没有办法获得一个没有指向的 C 流对象(FILE* 对象)?

我知道fopen("/dev/null","w"); 会起作用,但我想知道是否有更好的方法。

最好在比 posix 层更高的级别对数​​据进行分桶,这样也更便携。

【问题讨论】:

  • 为什么需要这样做?可能有更好的方法来做你想做的事情。
  • 我有一些登录到stderr 的地方,我希望能够用一个标志来关闭它。我真的不想做更多的事情,而不是更改传递给fprintf的变量。
  • 类似于stackoverflow.com/questions/1741191/…。 stdio 实现似乎总是支持这些东西,但 API 并没有提供一种很好的使用方式。

标签: c++ c file-io bitbucket


【解决方案1】:

否:Unix 上的 /dev/null 和 Windows 上的 NUL:(在没有 Cygwin 或等效软件的情况下)是最好的方法。

问题的原始版本提到了fopen("/dev/null","o");,但已经修复。
哦,"o" 标志 fopen() 是不可移植的。可移植形式包括标志字符rwab+ 的各种组合。

【讨论】:

  • “O”K,我知道我应该查一下。我是凭记忆工作的。
  • @Anacrolix:我不知道 'o' 是做什么的;它不可移植,不适用于我可用的系统......我认为它是'w'的变体。
  • 为什么 : - 在 Windows 上,空设备称为 NUL(请参阅 msdn.microsoft.com/en-us/library/… 以获取保留文件名的完整列表)
  • @Christoph:因为我错觉冒号要么是必要的,要么是可取的,以表明它是您想要的设备。如果冒号失败,这是我的回答中的一个可修复的错误;如果结肠只是不必要的,那么就把它归结为上个千年某个时候养成的坏习惯。在我的理解中,我并不完全是一个人 - 请参阅en.wikipedia.org/wiki/DOS#Reserved_device_names
【解决方案2】:

我有一些登录到 stderr 的地方,我希望能够用一个标志来关闭它。我真的宁愿不必做更多的事情,而不是更改传递给 fprintf 的变量

a) 包装函数

logging = TRUE;
void debugprint(...)
{
    if (logging)   
    {
        fprintf(stderr, ...);
    }
}

b) 如果你给它一个空指针,我认为 fprintf 会返回。不记得了——试一试。那么你所要做的就是改变指针:)

【讨论】:

  • a) 对于这么多工作,我可以切换到真正的日志记录系统。 b) 这值得研究 +1
  • b)快速环顾四周似乎表明fprintf(NULL,""); 将失败。
  • 您所要做的就是添加一个函数并搜索 + 替换 fprintf(stderr) 的所有实例。
  • 我认为可能。 C std lib 往往不会检查它的参数。
  • 将空文件指针传递给 fprintf() 会导致未定义的行为,并且通常会导致类 Unix 系统上的崩溃和核心转储。
猜你喜欢
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多