更新能够状态我试图完成打印语句在终端如下:C程序/忠告打印在终端
温度位置1 = 100℃
温度位置2 = 120℃
值可以改变的地方。所以我不知道如何解决这个问题。我应该尝试清除整个终端并重新打印吗?回车字符只会清除最近的行(例如位置2行),那么如何更改温度值1?非常感谢!
更新能够状态我试图完成打印语句在终端如下:C程序/忠告打印在终端
温度位置1 = 100℃
温度位置2 = 120℃
值可以改变的地方。所以我不知道如何解决这个问题。我应该尝试清除整个终端并重新打印吗?回车字符只会清除最近的行(例如位置2行),那么如何更改温度值1?非常感谢!
在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;
}
你的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;
}
(其中从C
到F
转换只是做以提供位置的第二温度2)
上面的代码只是更新位置1和位置2温度线每秒一次,温度为4秒0-3
C.如果你在窗户上,我把它留给你,以遵循上面的链接为你的特定版本的Windows。
还要注意,有以控制ncurses库提供光标或通过struct termios
有限的程度在termios.h
提供和tcsetattr
函数的其他方式。
一旦你印刷了一些东西,它就在那里。只有用户才能清除终端。在您打印完变量后更改变量将无济于事。 –
许多'终端'模拟器可以做光标定位和其他有用的东西,通常由转义序列驱动,但它们的操作不在C的范围之内。 –