是否有文件指针 (FILE*) 不指向任何内容

Is there a file pointer (FILE*) that points to nothing?

本文关键字:任何内 文件 指针 FILE 是否      更新时间:2023-10-16

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

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

[编辑:哎呀,我忘了Windows上的snprintf不符合C99。如果发生截断,则返回错误,而不是所需的长度。我不知道他们会怎么做C++0x需要符合C99标准的snprintf

要回答您的问题,您可以在类 UNIX 系统上打开/dev/null,或者在 Windows 上nul。写入生成的FILE*不起作用。但是,没有便携式空设备。

No.

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

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

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

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

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

你犯了一个设计错误。

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

您为此使用 _*printf_,这是一个好主意。您只想计算"写入"的字符数,因此需要。但是你不想显示任何东西,所以你刺了fprintf,而不仅仅是printf。但是 fprintf 在没有文件写入的情况下不起作用......

就像史蒂夫说的,你应该使用 snprintf((,它写入内存中的字符串。

正如 Steve 所说,与 NULL 字符串一起提供的 snprintf 应该按预期工作,除了在窗口上。然后在 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)

(可以增强此功能以计算显示任何内容所需的大小,但我宁愿暂时保持简单。

你的意思是这样吗?

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