写()到标准输出和printf输出不交叉存取?(write() to stdout and prin

2019-06-18 04:01发布

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

的printf的输出来按下Ctrl + d在标准输入,而不是沿与后续读取之后。 为什么会出现这种情况?

Answer 1:

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()被缓冲是一件好事。 无缓冲输出,特别是那些需要屏幕更新和可见这样的游戏机,是缓慢的。 慢,以至于被printf'ing很多应用程序可以通过它直接放缓(特别是在Windows平台上,Linux和Unix系统中,通常影响更小)。

但是, printf()被缓冲不咬你,如果你还fprintf(stderr,) - stderr是故意无缓冲。 因此,你可能会得到您的一些消息printf()丢失; 如果你写到另一个FILE ,它也与终端相关的手柄,并且可能是无缓冲,请务必先明确fflush(stdout)



Answer 2:

对于与fgets的手册页告诉我:

这是不可取的输入函数的调用从低层次stdio库混合调用来读取(2)文件描述符associ-与输入流ated; 结果将是不确定的,很可能不是你想要的。

所以,最好的办法是不使用write和printf在同一个描述符。



Answer 3:

printf的使用标准输入输出,它是缓冲。 推它通过发送一个改变为“n:%d:\ n”



Answer 4:

您可以使用std fflush()函数来刷新STD出缓冲器,或者你可以在里面的printf控制字符串末尾使用一个额外的\ n。 像这样的事情

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

它总是最好使用用C写()阅读()函数代替了printf()和scanf()的。 printf和scanf函数已经得到了一些问题,如printf专卖店在标准输出缓冲区中的字符串参数。 因此,一个手动冲洗需要其通过fflush函数或通过\ n来完成。 在一个小型的Hello World打印程序的标准输出缓冲区在程序执行结束刷新你不会找到这样的问题。 更好地利用写(),它工作正常。 scanf函数也有阅读空间的问题,很多相关的标准输入缓冲区等问题。

例如,在下面的代码:

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

作为得到的读数\问题n为进标准输入上按Enter键上面的程序。 我们可以解决这一点,但没有刷新标准输入缓冲区或利用\ n'字符。 总是最好使用read()和write()函数。

希望帮助....



Answer 5:

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

需要注意的是,虽然与文件号1相关的,它是不一样的事情。



文章来源: write() to stdout and printf output not interleaved?
标签: c printf stdout