LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 756|回复: 4

请教:C, 只在一行输出?

[复制链接]
发表于 2004-12-23 18:15:35 | 显示全部楼层 |阅读模式
写一个 C 程序,通过读取 /proc/net/dev 来得到 ppp0 的网络流量,然后打印出来(在一个循环中):
printf("IN: %3f, OUT: %3f KB\n", flowin, flowout);
但这样就不停的产生新行。我希望只打印在一行,只变化数据,就像 fsck 和 wget 运行是的效果。想到的最简单的办法:
printf("IN: %3f, OUT: %3f KB\r", flowin, flowout);
但是没用,结果是什么都不显示了。

然后我考虑用 curses 的 move(y, x),也没有用。

考虑过终端I/O,但<< UNIX 环境高级编程 >> 这本书好象讲的主要是关于输入。输出参数也尝试过改,比如:
struct termios term;
    term.c_oflag &= OCRNL;
    tcsetattr(STDIN_FILENO, TCSANOW, &term)
但是也没有效果。如果用终端I/O,应该怎样设置呢?

或其他好办法?

谢谢。
发表于 2004-12-23 18:50:00 | 显示全部楼层
没有看到结果的原因是因为标准输入输出函数向标准输出stdout写数据是行缓冲的,没有看到“\n”,你printf的内容被缓存了,直到缓冲区满或强制刷新的时候才显示出来,而这时连续的“\r”把前面输出的内容迅速冲掉了。

改成

fprintf(stderr, "IN: %3f, OUT: %3f KB\r", flowin, flowout);

或者

printf("IN: %3f, OUT: %3f KB\r", flowin, flowout);
fflush(stdout);
发表于 2004-12-24 09:31:10 | 显示全部楼层
这个问题用curses和vt100终端控制码肯定可以解决。但我没有具体做过。你尝试下先。vt100的资料在精华中有。
 楼主| 发表于 2004-12-24 19:05:55 | 显示全部楼层
Post by doubleelec
没有看到结果的原因是因为标准输入输出函数向标准输出stdout写数据是行缓冲的,没有看到“\n”,你printf的内容被缓存了,直到缓冲区满或强制刷新的时候才显示出来,而这时连续的“\r”把前面输出的内容迅速冲掉了。

改成

fprintf(stderr, "IN: %3f, OUT: %3f KB\r", flowin, flowout);

或者

printf("IN: %3f, OUT: %3f KB\r", flowin, flowout);
fflush(stdout);


是的,有效。非常感谢。
原理我虽然知道,但放到实际问题,就不知道怎么分析了,真是惭愧。

关于终端IO的内容,也还是没有弄得很清楚,还有待努力呀。
发表于 2004-12-31 23:53:42 | 显示全部楼层
我怎么 运行了 之后还是什么也看不到呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表