在C语言中需要一个不用清除缓冲区来延迟的函数

时间:2016-09-23 16:08:23

标签: c windows

我在Sleep()下使用windows.h功能进行延迟,但与sleep()下的unistd.h不同,它会清除缓冲区。 是否有延迟功能而不清除缓冲区?

#include<stdio.h> 
#include<windows.h> 

int main(void) 
{ 
  printf("hello"); 
  Sleep(2000); 
  return 0; 
}

1 个答案:

答案 0 :(得分:2)

看起来您需要stdout进行行缓冲,因此在没有换行符的情况下调用printf不会导致任何实际输出。但是,如果stdout可能是交互式设备,则C语言标准允许 行缓冲或不缓冲。使用Microsoft C运行时时,stdout将无缓冲。

因此,字符串hello将直接发送到标准输出,完全绕过运行时库缓冲。之后你正在调用Sleep()的事实与它无关。

您可以使用setvbuf()显式配置stdout进行完全缓冲,以便仅在显式刷新流时才会发送输出。请注意,Microsoft C运行时不支持行缓冲。

PS:您还应该注意,据我所知,运行时不需要提供任何特定大小的缓冲区,也不要求任何规则阻止它因任何可能需要它的原因而刷新缓冲区。如果您的程序必须直到稍后才写入输出,我认为唯一完全安全的方法是自己缓冲数据。