printf或任何输出函数实际上做了什么?

时间:2013-10-05 07:20:37

标签: c++ c outputstream

我想知道所有这些输出功能,基本上他们做了什么? 因为我经历了很多次,在遇到它时,printf并不总是在屏幕上打印,我听说它放入缓冲区或类似的东西。 所以如果有人能说清楚实际发生了什么。 如果还可以给出关于输入函数的相同信息,那将是很好的。 你告诉它的深度会更有帮助。 。 感谢。

2 个答案:

答案 0 :(得分:1)

大部分时间printf都是这样的:(没有缓冲部分和其他小东西)

表示%s标志:

void            my_putchar(char c)
{
  write(1, &c, 1);
}

int             my_putstr(char *str) // printf("%s", "hello");
{
  int           i;

  i = 0;

  while (str[i] != '\0')
    {
      my_putchar(str[i]);
      i = i + 1;
    }
}

和%d标志

void            my_put_nbr(int nb) // printf("%d", 100);
{
  if (nb > 9)
    my_put_nbr(nb / 10);
  my_putchar(nb % 10 + '0');
}

答案 1 :(得分:0)

  

<强> printf的

     

将format指向的C字符串写入标准输出(stdout)。   如果format包含格式说明符(以%开头的子序列),   格式化并插入格式后的附加参数   在结果字符串中替换它们各自的说明符。

这里已经很好地解释了printf实际上是如何运作的:

  1. 您的软件调用printf()。

  2. printf()处理你的字符串和args,然后需要执行 内核函数,因为无法在第3环中写入文件。

  3. printf()生成一个软件中断,放入寄存器中 内核函数的编号(在这种情况下,是write()函数)。

  4. 软件执行中断,指令指针 移动到内核代码。所以我们现在在内核中的0环 功能
  5. 内核处理请求,写入文件(stdout是一个 文件描述符)。

  6. 完成后,内核使用iret返回软件的代码 指令。

  7. 软件的代码仍在继续。

  8. ISO C99第7.19.3 / 3条

    中的一些有用的行
      

    如果未缓冲流,则会显示字符   来源或目的地尽快。除此以外   字符可以被累积并发送到主机或从主机发送   环境作为障碍。

         

    当流完全缓冲时,字符应该是   当缓冲区时,作为块传输到主机环境或从主机环境传输   充满了。

         

    当流被缓冲时,字符应该是   当换行时,作为块发送到主机环境或从主机环境发送   遇到了角色。

         

    此外,字符旨在作为块传输   当填充缓冲区时,请求输入时的主机环境   在无缓冲的流上,或在缓冲的行上请求输入时   需要从主机传输字符的流   环境。

         

    对这些特性的支持是实现定义的,并且可能   受到setbuf和setvbuf函数的影响。