用于在终端中打印可更新状态的C程序/建议

时间:2017-08-12 05:01:20

标签: c printing terminal carriage-return

我正在尝试在终端中完成print语句,如下所示:

温度位置1 = 100 C

温度位置2 = 120℃

值可以改变的地方。所以我不确定如何处理这个问题。我应该尝试清除整个终端并重新打印吗?返回托架字符仅清除最近的行(例如位置2行),那么如何更改温度1的值?非常感谢!

2 个答案:

答案 0 :(得分:1)

您的2行输出存在问题。通常,在行/列(或x,y)的基础上处理格式化输出时,您需要使用像ncurses这样的屏幕输出库来提供一些可靠的可移植性。

处理光标定位的另一种更不易移植的终端依赖方式是使用ANSI转义序列。 printf将解释ANSI转义,但不解释所有终端,而不是所有操作系统或实现。

Linux(大多数vt100仿真)将处理ANSI转义,对于Windows,有不同的方法来处理Win10(周年纪念更新)和以前的WinX版本之间的转义。两者都在Console Virtual Terminal Sequences

解释

在Linux上,您可以使用ESC[1A序列(使用八进制编号\033[1A编写033进行转义或\0x1b[1A使用 hex 1b)将光标向上移动一行(并'\r'移动到没有换行的开头)。因此ANSI转义\r\033[1A只是将光标移回到行的开头并向上移动一行。 (您可以在Windows上使用相同的序列,但是如何实现它依赖于Windows版本 - 请参阅提供的链接)

要显示的简单实现,例如

Location 1 = 3.00 C
Location 2 = 37.40 F

在Linux上每秒钟覆盖一次温度(实际上是两行):

#include <stdio.h>
#include <unistd.h>

double c_to_f (double c)
{
    return c * 9.0 / 5.0 + 32;
}

void print_temps (double t1, double t2)
{
    printf ("Location 1 = %.2lf C\nLocation 2 = %.2lf F\r\033[1A",
            t1, t2);
    fflush (stdout);
}

int main (void) {

    for (int i = 0; i < 4; i++) {
        print_temps (i, c_to_f(i));
        sleep (1);
    }

    printf ("\n\n");     /* tidy up with newlines */

    return 0;
}

(从CF的转换只是为了为位置2提供第二个温度

上面的代码只更新位置1和位置2的温度线,每秒一次,温度为0-3 C,持续4秒。如果你在Windows上,我会留给你按照上面的链接为你的特定版本的Windows。

另请注意,还有其他方法可以控制ncurses库中提供的游标,或者通过struct termiostermios.h函数中提供的tcsetattr来限制游标。

答案 1 :(得分:0)

使用&#34; \ r&#34;在你的printf函数中将光标移动到行的开头,但我不认为你可以打印两个动态更新的单独行。这是适合您最多目的的代码。在Windows中,睡眠功能是&#34;睡眠&#34;与一个大&#34; S&#34;来自文件&#34; Windows.h&#34;在Linux中它是&#34;睡眠&#34;与小&#34;&#34;来自&#34; unistd.h&#34;

<强> WINDOWS

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

int main(int argc, char *argv[]){

    int i = 0;
    int j = 0;

    while (i<100)
    {
        printf("\rTemperature Location 1 = %d Celsius and Temperature Location 2 = %d Celsius", i, j);
        j=j+2;
        i++;
        Sleep(1000); //sleeps the current thread for 1 sec
    }
    return 0;
}

<强> LINUX

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[]){

    int i = 0;
    int j = 0;

    while (i<100)
    {
        printf("\rTemperature Location 1 = %d Celsius and Temperature Location 2 = %d Celsius", i, j);
        j=j+2;
        i++;
        sleep(1);  //sleeps the current thread for 1 sec
    }
    return 0;
}