繁体   English   中英

为什么printf会返回一个值?

[英]Why does printf return a value?

我知道printf返回一个负面错误或成功打印的字符数。 只检查此返回值的唯一原因是程序的执行以某种方式取决于printf状态。 但我想不出这个返回值有用的场景。 我,从来没有检查过printf函数的返回值。

printf返回状态有用的场景是什么?

printf的返回值至少有2次使用:

  1. 检查错误。 当您的输出是交互式或纯信息时,这很少重要,但对于从stdio或文件处理文本并将结果写入stdout的程序,重要的是要知道是否有错误(例如磁盘已满,关闭管道或丢弃)网络连接)阻止了整个输出的写入。 如果输出完成后输出将删除/替换源文件,这一点尤其重要。 但是,由于缓冲,检查printf本身的结果通常没有帮助。 在写完最后一个输出并进行刷新后,您需要检查ferror(stdout) ,以便可靠地指示是否发生了写入错误。 在另一方面,检查返回值printf允许您检测故障 ,所以你不要浪费时间试图在第一线已经没有写百万行的,所以它可以是一个非常有用的检查; 它本身并不是一个充分的检查。

  2. 如果输出的字符数不明显,您可能想知道写入了多少个字符。 这个数字的天真用法是用于排列列,但假设字符在其视觉呈现中具有固定宽度是相当陈旧的。 但是,如果您要格式化源代码,则可能有意义。 另一个类似的用法(不确定这是否更少或更多过时)是在文件中写入固定宽度字段。 例如,如果您的字段是80个字节而printf返回52,那么您需要再写28个填充字节来完成该字段。

在某些情况下,您可能需要检查printf的返回值。 一个是检查错误,如你所说; 虽然如果printf上有错误,通常没有什么可以做的,如果你打印的东西真的很大,并且得到错误,你可以决定尝试用较小的块打印它。

您可能还对输出的宽度感兴趣; printf()返回成功写入的字符数。 如果你试图排列输出,并且你使用宽度可变的printf() ,你可以检查返回值以找出打印的字符数,这样你就可以知道你所在的列。 当然,这仅适用于所有字符都是1列宽(大多数ASCII字符都适用)的情况,但在某些情况下这可能会有用。

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

使用它的主要原因之一是进行故障排除。 Printf也可用于写入文件(不仅仅是STDOUT)。 确保所有字符都已写入文件在某些​​应用程序中至关重要。 下面是一个例子:

#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的返回值来确保正确打印这些错误。

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

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

例如,

#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;
}

我也从未使用过返回值。 但是除了错误检查之外,您可以计算已输出的字符数,以进行某种统计或限制

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

如果您必须确保您的字符串已完成,则可以使用返回值来查看此内容。

它在使用fprintf和插座等时很有用,但仍然有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM