C 写入()到stdout和printf输出是否未交错?

C 写入()到stdout和printf输出是否未交错?,c,printf,stdout,C,Printf,Stdout,printf的输出是在标准输入中按Ctrl+D键之后,而不是在后续读取时进行的。为什么会发生这种情况?Printf正在使用stdio,它被缓冲。 通过将更改发送到“n:%d:\n”将其推出。Printf已缓冲 您可以使用fflush调用强制printf“刷新”其缓冲区: read read write write n: 5:n: 6: #包括 #定义MAXLEN 256 int main(){ int n; char-buf[MAXLEN]; 而((n=read(0,buf,sizeof(bu

printf的输出是在标准输入中按Ctrl+D键之后,而不是在后续读取时进行的。为什么会发生这种情况?

Printf正在使用stdio,它被缓冲。 通过将更改发送到“n:%d:\n”将其推出。

Printf已缓冲

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

read
read
write
write
n: 5:n: 6:
#包括
#定义MAXLEN 256
int main(){
int n;
char-buf[MAXLEN];
而((n=read(0,buf,sizeof(buf)))!=0){
printf(“n:%d:,n);
fflush(stdout);/*强制它熄灭*/
写入(1,buf,n);
}
返回1;
}
一般来说,缓冲
printf()
是件好事。无缓冲输出,特别是对于需要屏幕更新等的可视控制台,速度较慢。速度足够慢,可以直接降低大量打印的应用程序的速度(特别是在Windows平台上;Linux和Unix通常受影响较小)


然而,
printf()。因此,您可能会收到缺少一些
printf()
的消息;如果您写入另一个
文件
句柄,该句柄也与终端关联,并且可能没有缓冲,请确保首先明确地
fflush(stdout)

fgets的手册页告诉我:

不建议从stdio混合调用输入函数 具有读取(2)文件描述符关联的低级调用的库 与输入流相匹配;结果将是未定义的,并且非常复杂 可能不是你想要的。 因此,最好的解决方案是不要在同一描述符上使用write和printf。

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

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

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

#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;
}
最好在C中使用write()和read()函数,而不是printf()和scanf()。Printf和scanf遇到了一些问题,比如Printf将字符串参数存储在stdout缓冲区中。因此,需要通过fflush功能或通过\n进行手动冲洗。在一个小的hello world打印程序中,您不会发现这样的问题,因为标准输出缓冲区在程序执行结束时被刷新。最好使用write(),它工作得很好。scanf还存在读取空间的问题以及与stdin缓冲区相关的许多其他问题

例如,在下面的代码中:

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

main(){char a;int i=0,c;for(;i)或者不要混合输出通道——也就是说,使用同一个函数输出所有内容。\n不保证刷新它。stdout是行缓冲的,除非它指向非交互设备。在执行任何IO之前,您还可以使用setvbuf()更改缓冲模式。会发生什么“
printf()
是”mean?@MattDiPasquale printf写入stdout,并且stdout是缓冲的(默认情况下)。它仅在line-feed上刷新。还应提及换行符('\n'))将导致stdoutflushed@carefulnow1:取决于它指向的位置。如果它指向一个文件,它通常是块缓冲的,只有当它到达一个终端时,它通常是行缓冲的。POSIX非常仔细地指定结果何时未定义,何时根据“活动句柄”的抽象概念定义良好”“看
printf("\n :%d:\n",n);
main()  {   char a; int i=0,c; for(;i<2;i++) { scanf("%d",&c); scanf("%c",&a);} }