This question already has answers here:
Why does printf not flush after the call unless a newline is in the format string?
(10个回答)
3年前关闭。
首先发布代码:
运行时发生了奇怪的事情:虽然
(10个回答)
3年前关闭。
首先发布代码:
#define EV_STANDALONE 1
#include <stdio.h>
#include "ev.c"
ev_timer timeout_watcher;
struct ev_loop* loop;
static void timeout_cb (EV_P_ ev_timer *w, int revents)
{
// puts("timeout");
printf("timeout");
ev_timer_again(loop, w);
}
int main (void)
{
printf("hello, world.");
loop = EV_DEFAULT;
ev_timer_init (&timeout_watcher, timeout_cb, 5.5, 0.);
timeout_watcher.repeat = 2.0;
ev_timer_start (loop, &timeout_watcher);
ev_run (loop, 0);
return 0;
}
运行时发生了奇怪的事情:虽然
printf("hello, world.");
在main函数中排在首位,但是它没有用。但是,如果我改用printf("hello, world\n");
,则一切正常。此外,我更改了printf("hello, world");
而不是puts("hello, world");
,它也起作用。那么,libev对io做了什么?为什么“ \ n”很重要? 最佳答案
通常,与标准输出关联的缓冲区是行缓冲的。写入缓冲区的内容不会立即传送到输出。
最后,\n
导致缓冲区内容的flush
到输出。
或者,您可以在没有fflush(stdout)
的printf()
之后使用\n
,但是请记住,这仅适用于输出缓冲区。
FWIW,回答puts()
为何有效的问题,引用手册页,(强调我的)
puts()
将字符串s
和结尾的换行符写入stdout。puts()
提供了一个隐式换行符,因此刷新了缓冲区。
关于c - 没有'\n'的printf()在libev中不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31179225/
10-16 19:16