我正在尝试在终端中完成print语句,如下所示:
温度位置1 = 100 C
温度位置2 = 120℃
值可以改变的地方。所以我不确定如何处理这个问题。我应该尝试清除整个终端并重新打印吗?返回托架字符仅清除最近的行(例如位置2行),那么如何更改温度1的值?非常感谢!
答案 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;
}
(从C
到F
的转换只是为了为位置2提供第二个温度
上面的代码只更新位置1和位置2的温度线,每秒一次,温度为0-3
C,持续4秒。如果你在Windows上,我会留给你按照上面的链接为你的特定版本的Windows。
另请注意,还有其他方法可以控制ncurses库中提供的游标,或者通过struct termios
和termios.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;
}