2017-08-12 131 views
0

更新能够状态我试图完成打印语句在终端如下:C程序/忠告打印在终端

温度位置1 = 100℃

温度位置2 = 120℃

值可以改变的地方。所以我不知道如何解决这个问题。我应该尝试清除整个终端并重新打印吗?回车字符只会清除最近的行(例如位置2行),那么如何更改温度值1?非常感谢!

+0

一旦你印刷了一些东西,它就在那里。只有用户才能清除终端。在您打印完变量后更改变量将无济于事。 –

+0

许多'终端'模拟器可以做光标定位和其他有用的东西,通常由转义序列驱动,但它们的操作不在C的范围之内。 –

回答

0

在printf函数中使用“\ r”将光标移动到行的开头,但我认为您不能打印两条动态更新的独立行。这里是适合你最大目的的代码。在Windows中,休眠功能是来自文件“Windows.h”的大“S”的睡眠功能,并且在Linux中是“睡眠”功能,来自“unistd.h”的小“s”

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; 
} 
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使用六角1b)将光标移动到上一行(和'\r'移动回到没有换行的开始)。所以ANSI转义\r\033[1A只是将光标移回到行的开头并向上。 (您可以在窗口上使用相同的序列,但实现方式取决于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温度线每秒一次,温度为4秒0-3 C.如果你在窗户上,我把它留给你,以遵循上面的链接为你的特定版本的Windows。

还要注意,有以控制ncurses库提供光标或通过struct termios有限的程度在termios.h提供和tcsetattr函数的其他方式。