【发布时间】:2013-10-12 06:34:38
【问题描述】:
我想知道所有这些输出函数,它们基本上是做什么的? 因为我经历过很多次 printf 在遇到它时并不总是在屏幕上打印,而且我听说它会放入缓冲区或类似的东西。 因此,如果有人可以清楚地说明实际发生了什么。 如果也可以提供有关输入功能的相同信息,那将是很好的.. 你讲得越深,就会有很大帮助。 . 谢谢。
【问题讨论】:
标签: c++ c outputstream
我想知道所有这些输出函数,它们基本上是做什么的? 因为我经历过很多次 printf 在遇到它时并不总是在屏幕上打印,而且我听说它会放入缓冲区或类似的东西。 因此,如果有人可以清楚地说明实际发生了什么。 如果也可以提供有关输入功能的相同信息,那将是很好的.. 你讲得越深,就会有很大帮助。 . 谢谢。
【问题讨论】:
标签: c++ c outputstream
大多数时候 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');
}
【讨论】:
Printf
将 format 指向的 C 字符串写入标准输出 (stdout)。 如果 format 包括格式说明符(以 % 开头的子序列), 格式后面的附加参数被格式化并插入 在结果字符串中替换它们各自的说明符。
这里已经很好地解释了printf 的实际工作原理:
您的软件调用 printf()。
printf() 处理你的字符串和参数,然后需要执行 一个内核函数,因为不能在 ring 3 中写入文件。
printf() 生成软件中断,将 内核函数的编号(在这种情况下是 write() 函数)。
内核处理请求,写入文件(stdout 是 文件描述符)。
完成后,内核使用 iret 返回到软件代码 说明。
软件代码继续。
ISO C99 第 7.19.3/3 节
中的一些有用行当一个流没有缓冲时,字符应该从 尽快到达源头或目的地。否则 字符可以累积并传输到主机或从主机传输 环境作为一个块。
当一个流被完全缓冲时,字符应该是 当缓冲区作为块传输到主机环境或从主机环境传输 已满。
当流被行缓冲时,字符旨在 当换行时作为块传输到主机环境或从主机环境传输 遇到字符。
此外,字符旨在作为一个块传输到 填充缓冲区时的主机环境,请求输入时 在无缓冲的流上,或在缓冲的行上请求输入时 需要从主机传输字符的流 环境。
对这些特性的支持是实现定义的,并且可能 受 setbuf 和 setvbuf 函数影响。
【讨论】: