写了一个console程序,但是想在同一行(同一位置)刷新显示的内容

wdz609 2007-04-03 06:26:50
如果只是刷新同一行,可一如下:
>>printf("current progress: %03d\r", progress);
但是我要是同时显示多行时怎么办?如:
>>printf("current progress: %03d\r", progress);
>>printf("current time: %02d:%02d:%02d\r", hour, minute, second);
...全文
1472 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wdz609 2007-04-06
  • 打赏
  • 举报
回复
忘了结贴了,呵呵
wdz609 2007-04-05
  • 打赏
  • 举报
回复
再次明确我的目的:实现多行(同一位置)刷新,呵呵。

TO:mLee79,请问linux下很简单吗?linux下好像对\r,\b不感冒啊,感觉上是把内容刷在其他地方了,显示不到屏幕上。能告诉我linux怎么实现吗?我会试试SetConsoleCursorPosition,据我同事说WriteConsole也能实现。

To:awl005(忽然),如果加上清屏,则需要配合使用sleep吧,要不然,屏幕闪动挺大的。

To:yf110,移动光标,是使用mLee79说的那个SetConsoleCursorPosition函数吗?:)

To:thinkinnight(逍遥),如果使用那么多的\b,我还不如使用\r呢,呵呵
yf110 2007-04-05
  • 打赏
  • 举报
回复
移动光标到指定位置,然后输出相关信息,可以覆盖原来相同位置的内容,达到刷新的目的。
awl005 2007-04-05
  • 打赏
  • 举报
回复
我是想同时刷新多行,即在屏幕上如下:
program //不需要不断刷新
user //不需要不断刷新
current progress: 45 //需要不断刷新
current time: 10:30:40 //需要不断刷新

如果只要这些信息的话,可以循环"清屏--输出"这个动作阿
thinkinnight 2007-04-05
  • 打赏
  • 举报
回复
根据hailongchang(我把QQ丢了......) 的例子做了一个,丑陋了点,将就着看看,然后改改吧
其实看那个例子就应该会做了,lz还是没动脑筋啊

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

int main()
{
//get current time
SYSTEMTIME t;
for(int i=0;i<120;i++)
{
GetLocalTime(&t);
printf("current time: %02d:%02d:%02d\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b",
t.wHour,t.wMinute,t.wSecond);
Sleep(1000);
}
return 0;
}
mLee79 2007-04-05
  • 打赏
  • 举报
回复
这个跟你平台和终端类型关系大些, 如果是 linux/unix 啥的简单些, 如果是 win 麻烦些, 用用 SetConsoleCursorPosition .... 啥的函数还是可以的, 不过木啥意思, 不如写 *nux 程序在 cygwin 下编译算了 ....
wdz609 2007-04-05
  • 打赏
  • 举报
回复
我是想同时刷新多行,即在屏幕上如下:
program //不需要不断刷新
user //不需要不断刷新
current progress: 45 //需要不断刷新
current time: 10:30:40 //需要不断刷新
wdz609 2007-04-05
  • 打赏
  • 举报
回复
我已经算是会用windows和linux下刷新多行了.windows下就用SetConsoleCursePosition和WriteConsole组合使用,设置颜色可用SetConsoleTextAttribute.
不过设置颜色对于WriteConsoleOutputCharacter不管用. 也可用WriteConsoleOutput完成同样的功能,不过就是设置输出字符时麻烦点.呵呵,谢谢大家哦
wdz609 2007-04-05
  • 打赏
  • 举报
回复
谢谢mLee79,我使用你提供的方法在linux执行的相当好,现在正在摸索windows下的方法,呵呵
MarLan 2007-04-05
  • 打赏
  • 举报
回复
\33[NA
楼上的强
mLee79 2007-04-05
  • 打赏
  • 举报
回复
全点的控制台转义字符 .......


格式: echo "\033[字背景颜色;字体颜色m字符串\033[0m"

例如:
echo "\033[41;36m something here \033[0m"

其中41的位置代表底色, 36的位置是代表字的颜色


那些ascii code 是对颜色调用的始末.
\033[ ; m …… \033[0m



字背景颜色范围:40----49
40:黑
41:深红
42:绿
43:黄色
44:蓝色
45:紫色
46:深绿
47:白色

字颜色:30-----------39
30:黑
31:红
32:绿
33:黄
34:蓝色
35:紫色
36:深绿
37:白色

===============================================ANSI控制码的说明
\33[0m 关闭所有属性
\33[1m 设置高亮度
\33[4m 下划线
\33[5m 闪烁
\33[7m 反显
\33[8m 消隐
\33[30m -- \33[37m 设置前景色
\33[40m -- \33[47m 设置背景色
\33[nA 光标上移n行
\33[nB 光标下移n行
\33[nC 光标右移n行
\33[nD 光标左移n行
\33[y;xH设置光标位置
\33[2J 清屏
\33[K 清除从光标到行尾的内容
\33[s 保存光标位置
\33[u 恢复光标位置
\33[?25l 隐藏光标
\33[?25h 显示光标
mLee79 2007-04-05
  • 打赏
  • 举报
回复
linux 下很简单啊, 可以用 curses , 简单的也可以酱紫 ...
#include <stdio.h>
#include <stdlib.h>

int main()
{
int cc , a , b , c , d;
printf( "\n\n\n\n\n" );
for( cc = 0; cc < 5 ; ++ cc )
{
a = rand() , b = rand() , c = rand() , d = rand();
printf(
"\33[5A"
"line1: \33[41;36m cc == %d \33[0m\n"
"line2: \33[36;40m a == %d \33[0m\n"
"line3: \33[36;40m b == %d \33[0m\n"
"line4: \33[36;40m c == %d \33[0m\n"
"line5: \33[36;40m d == %d \33[0m\n" ,
cc , a , b , c , d );
system( "sleep 1" );
}

return 0;
}

taodm 2007-04-04
  • 打赏
  • 举报
回复
这个,你还是别用console了吧,gui才是处理这种人机交互的。
todototry 2007-04-04
  • 打赏
  • 举报
回复
/r回车即可
hailongchang 2007-04-04
  • 打赏
  • 举报
回复
给你一个例子

文本模式下的进度百分比表示:
#include <stdio.h>
#include <windows.h>

int main(void)
{
int i = 0;

while (i <= 100)
{
printf("%4d%%\b\b\b\b\b", i);
i ++;
Sleep(100);
}

return 0;
}

64,660

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧