Kir*_*aga 3 c io gcc stdout delay
所以我的问题是我的程序运行得太快,以至于我无法看到它的行为方式.它应该使文本沿终端的边缘爬行.我试图sleep()在printf(...)s 之间做一个短暂的停顿,以便我可以看到它们打印时我们要去的文本.
这就是它的样子:
http://i.imgur.com/B6FFbNp.gif
所以我把sleep()函数放在printfs 之后,它会在再次启动循环之前暂停并使文本移动缓慢.但是,它会在程序开始之前无限期地暂停程序.这也发生在usleep和system("pause 1").这就是它的样子:
http://i.imgur.com/krGW3lB.gif
================================================== ================================
编辑:
好吧,我自己想出来了.似乎sleep()只有我放入\n我的琴弦才有效.我不知道为什么.我甚至没有在该死的手册中读过这篇文章.
所以,如果你有
printf("HELLO\n");
sleep(3);
printf("HELLO\n");
sleep(3);
printf("HELLO\n");
它将导致:
HELLO 
[暂停3秒]
HELLO 
[暂停3秒]
HELLO
但如果删除换行符,它将:
[暂停9秒]
HELLO HELLO HELLO
我不知道为什么会这样,但事实就是如此
================================================== ================================编辑:
这就是我希望我的程序工作的方式:http: //i.imgur.com/DXv7E60.gif
谢谢您的回答
你的观察不是因为sleep()不工作,而是因为printf()使用了stdout线缓冲的事实."line buffered"意味着,已经写入的内容stdout被缓冲,直到在缓冲区的内容被刷新之前到达行的末尾.
因此,在第printf("HELLO");一个输出没有进入屏幕但保留在缓冲区之后,然后sleep(1);执行并让你等待.然后对于下一个printf("HELLO");输出仍然没有进入屏幕,但是下面的内容   sleep(1);再次让你等待1秒......依此类推,直到你的程序打印'\n'到程序结束或者程序结束时行结束,这会隐式刷新输出缓冲区到控制台.
您可以通过stdout在每个之后显式刷新输出缓冲区来避免此行为printf():
#include <stdio.h>
#include <unistd.h>
int main(void)
{
  printf("HELLO");
  fflush(stdout);
  sleep(3);
  printf("HELLO");
  fflush(stdout);
  sleep(3);
  printf("HELLO");
/* fflush(stdout); */ /* not needed as buffers are implicitly flushed on the program's end */
  return 0;
}