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

C++ printf或任何输出函数实际上做什么?,c++,c,outputstream,C++,C,Outputstream,我想知道所有这些输出函数,基本上是做什么的? 因为我经历过很多次,printf在遇到它的时候并不总是在屏幕上打印,我听说它会放入缓冲区或类似的东西。 因此,如果有人能清楚地说明实际发生了什么。 如果还可以提供关于输入函数的相同信息,那就太好了。。 你说得越深入,就会越有帮助。 谢谢 Printf 将格式指向的C字符串写入标准输出(stdout)。 如果格式包含格式说明符(以%)开头的子序列, 格式后面的附加参数已格式化并插入 在结果字符串中替换各自的说明符 这里已经很好地解释了实际工作原理: 您

我想知道所有这些输出函数,基本上是做什么的? 因为我经历过很多次,printf在遇到它的时候并不总是在屏幕上打印,我听说它会放入缓冲区或类似的东西。 因此,如果有人能清楚地说明实际发生了什么。 如果还可以提供关于输入函数的相同信息,那就太好了。。 你说得越深入,就会越有帮助。 谢谢

Printf

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

这里已经很好地解释了实际工作原理:

  • 您的软件调用printf()

  • printf()处理字符串和参数,然后需要执行 内核函数,如写入文件不能在环3中完成

  • printf()生成一个软件中断,将 内核函数(在这种情况下为write()函数)的编号

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

  • 完成后,内核使用iret返回软件代码 指示

  • 软件的代码将继续

  • ISO C99第7.19.3/3节中的一些有用的行

    当流未缓冲时,字符将从中显示 尽快将源文件或文件发送到目标文件。否则 字符可以累积并传输到主机或从主机传输 将环境视为块

    当一个流被完全缓冲时,字符被指定为 当缓冲区被激活时,作为块传输到主机环境或从主机环境传输 已经满了

    当一个流被行缓冲时,字符被指定为 当新线出现时,作为块传输到主机环境或从主机环境传输 遇到字符

    此外,字符打算作为块传输到 当缓冲区被填满、请求输入时的主机环境 在非缓冲流上,或在缓冲行上请求输入时 需要从主机传输字符的流 环境

    对这些特性的支持由实现定义,并且可能 通过setbuf和setvbuf功能受影响


    大多数时候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');
    }
    

    谢谢,但这并不能解释缓冲区部分。为什么有时只有遇到“\n”@RahulBhojwani时才会打印:-stdout流是缓冲的,所以只有在到达换行符后才会显示缓冲区中的内容