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

#include  #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: 

printf的输出在标准输入处按Ctrl + D后出现,而不是随后的读取。 为什么会这样?

Printf是缓冲的。

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

 #include  #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是故意无缓冲的fprintf(stderr,)那么被缓冲的printf()会咬你。 因此,您可能会收到一些缺少printf()消息; 如果您写入另一个也与终端关联的FILE句柄,并且可能没有缓冲,请确保首先显式fflush(stdout)

fgets的联机帮助页告诉我:

不建议将stdio库中的输入函数调用与对输入流相关的文件描述符的read(2)进行低级调用混合; 结果将是不确定的,很可能不是你想要的。

所以最好的解决方案是不要在同一个描述符上使用write和printf。

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

您可以使用std fflush()函数来刷新std out缓冲区,或者您可以在printf内的控制字符串末尾使用额外的\ n。 像这样的东西

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

最好在C中使用write()和read()函数而不是printf()和scanf()。 printf和scanf遇到了一些问题,比如printf将字符串参数存储在stdout缓冲区中。 因此需要通过fflushfunction或通过\ n进行手动冲洗。 在一个小的hello world打印程序中,你不会发现这样的问题,因为stdout缓冲区在程序执行结束时被刷新。 更好的使用write()工作正常。 scanf也有读取空间的问题以及与stdin缓冲区相关的许多其他问题。

例如,在下面的代码中:

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

上面的程序在按下回车时读到了进入标准输入的问题。 我们可以解决这个问题,但不能刷新stdin缓冲区或使用\ n字符。 总是更好地使用read()和write()函数。

希望有所帮助....

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

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