我在标准输出中的打印件顺序不正确
My prints in the standard output aren't in good order
我想做一个删除标准输出中打印字符的功能。然而事实证明它在我实际的 printf
之前打印了 '\b'
我尝试打印 t
它之前也打印过。
我用自己的函数打印 '\b'
,但它确实适用于 putchar
。我不明白为什么。
这是我的代码:
void ft_putchar_a(char c)
{
write(1, &c, 1);
}
void delete_std(int n)
{
int i;
i = 0;
while (i < n)
{
ft_putchar_a('\b');
i++;
}
}
int main()
{
printf("Hello");
delete_std(5);
return (0);
}
你的问题很简单。标准库维护它写入每个文件(包括标准输出)的数据缓冲区。 printf
将数据写入该缓冲区。
write
通常不使用该缓冲区。因此,您正在将数据写入缓冲区,然后调用 write
写入“过去”缓冲区,然后当您的程序退出时,数据从缓冲区刷新到流中——但是退格键已经写了。
有几种方法可以解决这个问题。最简单的方法是对所有数据使用标准 C 输出例程。例如:
void ft_putchar_a(char c)
{
// write(1, &c, 1);
fputc(c, stdout);
}
这样,所有的输出都会被写入缓冲区,并保持有序。您可以(理论上)改为通过 write
执行所有输出,但除非您添加自己的缓冲,否则效率会非常低(这就是标准库首先进行缓冲的原因)。
另一种可能性(但有点难看,IMO)是在您通过 printf
:
写入后刷新缓冲区
printf("Hello");
fflush(stdout);
delete_std(5);
这将使这个特定的代码工作,但留下了根本问题,所以任何时候你使用你的 ft_putchar_a
,你都会 运行 进入同样的事情。我想你可以将补丁合并到 ft_putchar_a
本身,以至少确保它始终如一地发生:
void f_putchar_a(char c) {
fflush(stdout);
write(1, &c, 1);
}
...但是始终使用 C 输出更清晰、更直接。
我想做一个删除标准输出中打印字符的功能。然而事实证明它在我实际的 printf
之前打印了 '\b'
我尝试打印 t
它之前也打印过。
我用自己的函数打印 '\b'
,但它确实适用于 putchar
。我不明白为什么。
这是我的代码:
void ft_putchar_a(char c)
{
write(1, &c, 1);
}
void delete_std(int n)
{
int i;
i = 0;
while (i < n)
{
ft_putchar_a('\b');
i++;
}
}
int main()
{
printf("Hello");
delete_std(5);
return (0);
}
你的问题很简单。标准库维护它写入每个文件(包括标准输出)的数据缓冲区。 printf
将数据写入该缓冲区。
write
通常不使用该缓冲区。因此,您正在将数据写入缓冲区,然后调用 write
写入“过去”缓冲区,然后当您的程序退出时,数据从缓冲区刷新到流中——但是退格键已经写了。
有几种方法可以解决这个问题。最简单的方法是对所有数据使用标准 C 输出例程。例如:
void ft_putchar_a(char c)
{
// write(1, &c, 1);
fputc(c, stdout);
}
这样,所有的输出都会被写入缓冲区,并保持有序。您可以(理论上)改为通过 write
执行所有输出,但除非您添加自己的缓冲,否则效率会非常低(这就是标准库首先进行缓冲的原因)。
另一种可能性(但有点难看,IMO)是在您通过 printf
:
printf("Hello");
fflush(stdout);
delete_std(5);
这将使这个特定的代码工作,但留下了根本问题,所以任何时候你使用你的 ft_putchar_a
,你都会 运行 进入同样的事情。我想你可以将补丁合并到 ft_putchar_a
本身,以至少确保它始终如一地发生:
void f_putchar_a(char c) {
fflush(stdout);
write(1, &c, 1);
}
...但是始终使用 C 输出更清晰、更直接。