3

由于某些原因,我需要一个不指向任何内容的文件指针 (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*)?

4

6 回答 6

8

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

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

要回答您的问题,您可以/dev/null在类 UNIX 系统或nulWindows 上打开 fopen。写入结果FILE*没有效果。但是,没有便携式零设备。

于 2011-09-12T08:35:42.513 回答
6

不。

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

于 2011-09-12T08:12:27.640 回答
0

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

于 2011-09-12T08:12:21.383 回答
0

尽管正如 NirMH 所说,您可以将其包含在 中if (nothing != NULL),但还有另一种方法。您可以在读取模式下打开文件(使用"r"),当您将其发送到时fprintf,写入将被忽略(编辑:如评论中所述,请记住将其设置n=0为负数fprintf)。

我个人建议第一种方法。我可能会做第二个的唯一原因是如果我不能更改功能。

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

于 2011-09-12T08:37:31.450 回答
0

你犯了一个设计错误。

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

为此,您正在使用 _*printf_,这是个​​好主意。您只想计算“写入”的字符数,因此需要。但是您不希望显示任何内容,因此您刺破了fprintf而不仅仅是printf。但是如果没有要写入的文件, fprintf就无法工作......

就像史蒂夫说的那样,您应该使用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)

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

于 2011-09-12T10:15:22.983 回答
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;
}
于 2020-02-06T11:47:55.467 回答