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相关联,但它不是一回事。