jazeltq 发表于 2011-09-16 10:22

linux 如何在终端中一行内显示信息

本帖最后由 jazeltq 于 2011-09-21 10:03 编辑

现在想实现这样的功能,就是在终端中打印一行后,这一行的内容消失,
下一行第一行的位置打印,然后在消失。

如果想实现这样的功能,该如何实现,有思路就行,谢谢

MMMIX 发表于 2011-09-16 11:26

回复 1# jazeltq


    看看 termios(3).

tbxuexi2 发表于 2011-09-16 14:46

学习了

jazeltq 发表于 2011-09-18 21:48

termios(3).
这个我看两, 但是不太明白, 跟我到这个实现有什么关系,
我看到有vkill这个字符, 你到意思是说我在printf之后, 下次printf之前得输入这个字符吗?
还是其它意思?

MMMIX 发表于 2011-09-19 00:09

termios(3).
这个我看两, 但是不太明白, 跟我到这个实现有什么关系,
jazeltq 发表于 2011-09-18 21:48 http://bbs.chinaunix.net/images/common/back.gif


    如果你只是想要個簡單的類似進度條的效果,那麼用 printf(3) 就可以了,更複雜的效果就需要 termios(3) 提供的功能了。
#include <stdio.h>
#include <string.h>
#include <time.h>

int
main(void)
{
        int i;
        char pbar;
        struct timespec interval;

        interval.tv_sec = 0;
        interval.tv_nsec = 10000000L;

        memset(pbar, ' ', sizeof(pbar));
        pbar = '\0';

        for (i = 1; i <= 100; i++) {
                pbar = '=';
                pbar = '>';

                printf("%2d%% [%s]\r", i, pbar+1);
                fflush(stdout);
                nanosleep(&interval, NULL);
        }
        printf("\n");

        return 0;
}

jazeltq 发表于 2011-09-19 11:27

谢谢 ls 这为兄弟, 我想实现的功能比进度条复杂些
printf(" Reading file ....    %d(out of %d)", read_file_num++, total_file_num);
就让这行信息, 一直在一行显示,不刷屏,
不知道我说清楚我的想法了没有?

jazeltq 发表于 2011-09-19 11:32

另外, 你说的termios 也实验过,
vkill = \035默认的删除本行的特殊字符, 我想的是 在打完一行之后, 通过printf把vkill特殊字符写入
测试程序思路是这样的
printf("file %d", file_num++);
printf("\035");
但是的结果显示的输出还是会刷屏, 是我思路有问题吗?

MMMIX 发表于 2011-09-19 12:11


谢谢 ls 这为兄弟, 我想实现的功能比进度条复杂些
printf(" Reading file ....    %d(out of %d)", read_file_num++, total_file_num);
就让这行信息, 一直在一行显示,不刷屏,
jazeltq 发表于 2011-09-19 11:27 http://bbs.chinaunix.net/images/common/back.gif


    我上面的代码实现的就是这个功能啊,你运行过它么?

jazeltq 发表于 2011-09-19 13:04

我上面的代码实现的就是这个功能啊,你运行过它么?
MMMIX 发表于 2011-09-19 12:11 http://bbs.chinaunix.net/images/common/back.gif


仁兄,我运行你写的这个程序了, 的确不是我想要的功能
我想只在一行内打印进度信息,打印完一条,就擦除它,然后打印下一条,再擦除,再打印。。。
这样所有信息都在一行内显示

MMMIX 发表于 2011-09-19 15:52

仁兄,我运行你写的这个程序了, 的确不是我想要的功能


代码是直接拷贝的?还是你比着我的改的?把你运行的结果贴出来看看。


我想只在一行内打印进度信息,打印完一条,就擦除它,然后打印下一条,再擦除,再打印。。
jazeltq 发表于 2011-09-19 13:04 http://bbs.chinaunix.net/images/common/back.gif


    我可不就是这么打印的? printf() 中的那个 '\r' 就是让打印从当前行的开头开始。
页: [1] 2
查看完整版本: linux 如何在终端中一行内显示信息