write() 到 stdout 和 printf 输出不交错?

发布于 2024-07-29 22:51:16 字数 415 浏览 3 评论 0原文

#include <stdio.h>
#define MAXLEN 256

int main() {
  int n;
  char buf[MAXLEN];
  while((n = read(0,buf,sizeof(buf))) != 0){
    printf("n: %d:",n);
    write(1,buf,n);
  }
  return 1;
}

程序的输出(其中第一个 read 和第一个 write 由用户键入并由终端回显)是:

read
read
write
write
n: 5:n: 6:

按 Ctrl+D 后 printf 的输出在标准输入中而不是与后续读取一起。 为什么会出现这种情况?

#include <stdio.h>
#define MAXLEN 256

int main() {
  int n;
  char buf[MAXLEN];
  while((n = read(0,buf,sizeof(buf))) != 0){
    printf("n: %d:",n);
    write(1,buf,n);
  }
  return 1;
}

The output of the program (where the first read and first write is typed by the user and echoed by the terminal) is:

read
read
write
write
n: 5:n: 6:

The output of printf comes after pressing Ctrl+D at the standard input and not along with the subsequent reads. Why does this happen?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

如痴如狂 2024-08-05 22:51:18

您可以使用 std fflush() 函数刷新 std 输出缓冲区,也可以在 printf 内的控制字符串末尾使用附加的 \n。 像这样的东西

printf("\n :%d:\n",n);

使用 write() & 总是更好 C 语言中的 read() 函数代替了 printf() 和 scanf()。 Printf 和 scanf 存在一些问题,例如 printf 将字符串参数存储在 stdout 缓冲区中。 因此需要手动刷新,这是通过 fflush 函数或通过 \n 完成的。 在一个小的 hello world 打印程序中,您不会发现这样的问题,因为标准输出缓冲区在程序执行结束时被刷新。 最好使用 write() ,效果很好。 scanf 还存在读取空间的问题以及许多与 stdin 缓冲区相关的其他问题。

例如,在下面的代码中:

main()  {   char a; int i=0,c; for(;i<2;i++) { scanf("%d",&c); scanf("%c",&a);} }

上面的程序遇到了按 Enter 键时将 \n 读入 stdin 的问题。 我们可以解决这个问题,但不刷新标准输入缓冲区或使用 \n 字符。 最好使用 read() 和 write() 函数。

希望有帮助......

You can use the std fflush() function to flush the std out buffer or you can make use of an additional \n at the end of the control string inside the printf. Something like this

printf("\n :%d:\n",n);

Its always better to use the write() & read() functions in C instead of printf() and scanf(). Printf and scanf have got some problems like printf stores the string parameter in stdout buffer. So a manual flush is required which is done through fflush function or by means of \n. In a small hello world printing program you will not find such a problem as the stdout buffer is flushed at the end of the program execution. Better use write() which works fine. scanf also have the problem of reading spaces and a lot of other problems related to stdin buffer.

For example in the code below:

main()  {   char a; int i=0,c; for(;i<2;i++) { scanf("%d",&c); scanf("%c",&a);} }

The above program as got the problem of reading \n into stdin on pressing enter. We could resolve this but not flushing the stdin buffer or making use of \n character. Always better to use the read() and write() functions.

Hope that helps....

长伴 2024-08-05 22:51:18

使用 fwrite(流版本)而不是 write。

请注意,虽然 与文件号 1 相关联,但它不是同一件事。

Use fwrite (streams version) rather than write.

Note that, while is associated with file number 1, it isn't the same thing.

亚希 2024-08-05 22:51:18

Printf 使用 stdio 并且它是缓冲的。
通过发送更改到“n: %d:\n”将其推出

Printf is using stdio and it is buffered.
Push it out by sending a changing to "n: %d:\n"

吾家有女初长成 2024-08-05 22:51:17

Printf 被缓冲。

您可以使用 fflush 调用强制 printf“刷新”其缓冲区:

#include <stdio.h>
#define MAXLEN 256

int main() {
  int n;
  char buf[MAXLEN];
  while((n = read(0,buf,sizeof(buf))) != 0){
    printf("n: %d:",n);
    fflush(stdout); /* force it to go out */
    write(1,buf,n);
  }
  return 1;
}

一般来说,printf() 被缓冲是一件好事。 无缓冲的输出,尤其是需要屏幕更新等的可见控制台,速度很慢。 速度足够慢,以至于大量打印的应用程序可能会直接减慢速度(特别是在 Windows 平台上;Linux 和 Unix 受影响通常较小)。

但是,如果您还特意不缓冲 fprintf(stderr,) - stderr,那么缓冲的 printf() 确实会给您带来麻烦。 因此,您收到的消息可能会缺少一些printf(); 如果您写入另一个也与终端关联且可能未缓冲的FILE句柄,请确保首先显式fflush(stdout)

Printf is buffered.

You can force printf to 'flush' its buffer using the fflush call:

#include <stdio.h>
#define MAXLEN 256

int main() {
  int n;
  char buf[MAXLEN];
  while((n = read(0,buf,sizeof(buf))) != 0){
    printf("n: %d:",n);
    fflush(stdout); /* force it to go out */
    write(1,buf,n);
  }
  return 1;
}

In general, printf() being buffered is a good thing. Unbuffered output, particularly to visible consoles that require screen updates and such, is slow. Slow enough that an application that is printf'ing a lot can be directly slowed down by it (especially on the Windows platform; Linux and unixes are typically impacted less).

However, printf() being buffered does bite you if you also fprintf(stderr,) - stderr is deliberately unbuffered. As a consequence, you may get your messages with some printf() missing; if you write to another FILE handle that is also associated with the terminal, and might be unbuffered, make sure you first explicitly fflush(stdout).

少女情怀诗 2024-08-05 22:51:17

fgets 的联机帮助页告诉我:

不建议混合调用 stdio 的输入函数
具有对文件描述符关联的 read(2) 的低级调用的库
与输入流一起使用; 结果将是不确定的并且非常
可能不是你想要的。

因此,最好的解决方案是不要在同一描述符上使用 write 和 printf。

The manpage for fgets tells me:

It is not advisable to mix calls to input functions from the stdio
library with low-level calls to read(2) for the file descriptor associ‐
ated with the input stream; the results will be undefined and very
probably not what you want.

So the best solution would be not to to use write and printf on the same descriptor.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文