2012-11-23 116 views
12

我知道printf返回一个负面错误或成功打印的字符数。只有理由检查此返回值是否程序的执行取决于printf状态。但我想不出这种返回值有用的场景。例如,我从来没有检查过printf函数的返回值。为什么printf返回一个值?

printf返回状态有用的情况有哪些?

回答

0

我也从未使用过返回值。 但在错误检查旁边,您可能会计算已输出的字符数,以进行某种统计或限制

1

它主要用于错误检查。您可以使用返回值确保操作成功或不成功。

如果返回非负值(表示写入的字符数),则表示操作成功。如果返回负数,则出现一些错误。

例如,

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    int result = printf("This is a test!"); 
    if (result > 0) 
    { 
     printf("%d characters were written!", result); 
     return EXIT_SUCCESS; 
    } 
    else return EXIT_FAILURE; 
} 
2

其中一个主要的原因,这是使用用于故障排除。 Printf可以用来写入文件(不仅是标准输出)。确保所有文字都写在文件中对于某些应用程序至关重要。一个例子可以在下面找到:

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    FILE *fp; 

    printf("This will display on the screen.\n"); 

    if((fp=freopen("OUT", "w" ,stdout))==NULL) { 
    printf("Cannot open file.\n"); 
    exit(1); 
    } 

    if(printf("This will be written to the file OUT.") < 0){ 
     return -1; 
    } 

    fclose(fp); 

    return 0; 
} 

你可能会问你为什么要用printf来打印文件。考虑这一点。一些软件的开发没有实现错误日志记录,而是使用了printf。知识丰富的C程序员可以将printf的输出重定向到代码顶部的文件,从而实现将错误记录到文件而不是STDOUT。在这一点上,他可以使用printf的返回值来确保这些错误被正确打印。

+0

这是一个糟糕的例子,其中printf()的返回值被检查! – AlexWien

0

在某些情况下,printf只能将您的字符串的一部分放入stdout,而这不是错误。

如果您必须确保您的字符串发送完成,则可以使用返回值来查看此信息。

其最适用于与fprintf和插座等工作,但仍然可能是有用的。

5

有几种情况可能需要检查printf的返回值。其中之一就是检查错误,正如你提到的那样;如果printf出现错误,通常没有办法做到这一点,但是如果您打印的内容真的很大,并且出现错误,请尝试将它打印成小块。

您可能还对产量有多大感兴趣; printf()返回成功写入的字符数。如果您尝试排列输出,并且您使用宽度可变的东西执行printf(),则可以检查返回值以查明打印了多少个字符,以便知道您所在的列。当然,只有当你的所有字符都是1列宽(大多数ASCII字符都是如此)时,这才有效,但在某些情况下这可能会有用。

snprintf()打印到固定大小的缓冲区而不是标准输出或文件。它只会打印到您提供的缓冲区的大小;但可能需要更多空间来打印完整的字符串。它返回打印完整字符串所需的空间量;这样,您可以使用返回值分配适当大小的新缓冲区,如果原始缓冲区太小,请重试。出于这个原因,您几乎总是使用返回值snprintf()

16

还有的printf返回值的至少2个用途:

  1. 检查错误。当您的输出是交互式或纯粹的信息时,这很少重要,但对于正在处理来自stdio或文件的文本并将结果写入标准输出的程序,重要的是要知道错误(例如磁盘已满,已关闭管道或已丢弃网络连接)阻止了整个输出的写入。如果在输出完成后源文件将被删除/替换为输出,这一点尤其重要。但是,由于缓冲,检查printf本身的结果通常没有帮助。在写入最后一个输出和刷新之后,您需要检查ferror(stdout)以获得是否发生任何写入错误的可靠指示。另一方面,检查返回值printf允许您检测到故障早期,因此您不会浪费时间在第一行失败时尝试写入数百万行,因此这可能是非常有用的检查;它本身并不是一个足够的检查。

  2. 如果输出的字符数不明显,您可能想知道已写入了多少个字符。这个数字的天真使用将用于排列列,但假设角色在其视觉呈现中具有固定的宽度是过时的。不过,如果您要格式化源代码,则可能有意义。另一个类似的用法(不确定这是否过时或过时)是在文件中写入固定宽度的字段。例如,如果你的字段是80个字节,并且printf返回52,你希望再写入28个填充字节来结束这个字段。

相关问题