是否有指向空的文件指针(FILE *)?

时间:2011-09-12 08:10:04

标签: c++ file-pointer

由于某些原因,我需要一个指向空的文件指针(FILE *)。这意味着我可以将它传递给fprintf函数,fprintf忽略文件指针。

例如:

void my_function()
{
  FILE* nothing = NULL; // NULL is not correct.
  int n = fprintf(nothing, "PI = %f", 3.14); // Note: When nothing = NULL, error ocured.
}

是否有指向空的文件指针(FILE *)?

6 个答案:

答案 0 :(得分:7)

要解决您的实际问题(在评论中说明),请使用snprintf代替printf,前提是它在C ++实现中可用(在C ++ 03中无法保证)。传入缓冲区的空指针,大小为0。没有写入任何内容,但返回值是格式化字符串的长度(不包括nul终止符)。

[编辑:oops,我忘了Windows上的snprintf不符合C99。如果发生截断,则返回错误,而不是所需的长度。我不知道他们将如何处理C ++ 0x需要符合C99 snprintf的事实。]

要回答您的问题,您可以在类UNIX系统上/dev/null或在Windows上nul启用。写入结果FILE*无效。但是,没有可移植的空设备。

答案 1 :(得分:6)

没有

您的代码将导致运行时异常。例如,如果你在支持它的操作系统上运行,你可以使用/dev/null,但是没有像C ++中内置的那样。

答案 2 :(得分:0)

为什么不用if (NULL != nothing)语句包装fprintf方法?

答案 3 :(得分:0)

虽然正如NirMH所说,你可以把它括在if (nothing != NULL)中,还有另外一种方法。您可以以读取模式打开文件(使用"r"),当您将文件发送到fprintf时,将忽略写入(编辑:如评论中所述,请记住设置n=0如果它是fprintf)返回的负数。

我个人建议使用第一种方法。我可以做第二个的唯一原因是我不能改变功能。

如果你不关心你的代码是否依赖于系统,你可以在linux中使用/dev/null,在windows等中使用nul

答案 4 :(得分:0)

你犯了一个设计错误。

显然,您想知道的是编写号码所需的字符数。

你正在使用_ * printf_,这是一个好主意。你只想计算“写”的字符数,因此需要。但是你不希望显示任何内容,所以你刺破了 fprintf ,而不仅仅是 printf 。但 fprintf 在没有FILE的情况下无法写入...

像史蒂夫说的那样,你应该使用snprintf(),它会在内存中写入一个字符串。

正如史蒂夫所说,提供NULL字符串的 snprintf 应该按预期工作,除了在Windows上。然后在Windows上,只提供一个临时字符串,然后你将丢弃它。

size_t computeNumCharsNeededToPrintMyStuff(double d)
{
    size_t ret = 0;
    size_t maxBuffSize = 100; // should be plenty enough

    char *tmpBuff = new char[maxBuffSize ];
    ret = snprintf(tmpBuff, maxBuffSize, "PI = %f", d);
    delete[] tmpBuff;

    return ret;
}

然后你打电话:

n = computeNumCharsNeededToPrintMyStuff(3.14)

(可以增强此函数来计算显示任何内容所需的大小,但我现在暂时保持简单。)

答案 5 :(得分:0)

你的意思是这样吗?

#include <stdio.h>
int main()
{
    FILE *fdevnull = fopen("/dev/null", "w");
    printf("printf length=%d\n", fprintf(fdevnull, "Hello World '%s'=%f\n", "PI", 3.14159));
    fclose(fdevnull);
    return 0;
}