由于某些原因,我需要一个指向空的文件指针(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 *)?
答案 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;
}