Update printf Wert in derselben Zeile statt neue
Ich würde gerne wissen, ob es eine Möglichkeit gibt in C
überschreiben den Wert, der bereits gedruckt wurde, statt dem erstellen einer neuen Zeile jedes mal, oder nur Bewegung in einem Raum. Ich muss, erhalten Sie in Echtzeit Daten von einem sensor und möchte, dass es gerade dort zu sitzen und halten die Aktualisierung der existierenden Werte ohne scrollen. Ist das möglich?
UPDATE: CODE HINZUGEFÜGT
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdint.h>
#include <time.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>
#define CTRL_REG1 0x20
#define CTRL_REG2 0x21
#define CTRL_REG3 0x22
#define CTRL_REG4 0x23
int fd;
short x = 0;
short y = 0;
short z = 0;
int main (){
fd = wiringPiI2CSetup(0x69); //I2C address of gyro
wiringPiI2CWriteReg8(fd, CTRL_REG1, 0x1F); //Turn on all axes, disable power down
wiringPiI2CWriteReg8(fd, CTRL_REG3, 0x08); //Enable control ready signal
wiringPiI2CWriteReg8(fd, CTRL_REG4, 0x80); //Set scale (500 deg/sec)
delay(200); //Wait to synchronize
void getGyroValues (){
int MSB, LSB;
LSB = wiringPiI2CReadReg8(fd, 0x28);
MSB = wiringPiI2CReadReg8(fd, 0x29);
x = ((MSB << 8) | LSB);
MSB = wiringPiI2CReadReg8(fd, 0x2B);
LSB = wiringPiI2CReadReg8(fd, 0x2A);
y = ((MSB << 8) | LSB);
MSB = wiringPiI2CReadReg8(fd, 0x2D);
LSB = wiringPiI2CReadReg8(fd, 0x2C);
z = ((MSB << 8) | LSB);
}
for (int i=0;i<10;i++){
getGyroValues();
//In following Divinding by 114 reduces noise
printf("Value of X is: %d\r", x/114);
// printf("Value of Y is: %d", y/114);
// printf("Value of Z is: %d\r", z/114);
int t = wiringPiI2CReadReg8(fd, 0x26);
t = (t*1.8)+32;//convert Celcius to Fareinheit
int a = wiringPiI2CReadReg8(fd,0x2B);
int b = wiringPiI2CReadReg8(fd,0x2A);
// printf("Y_L equals: %d\r", a);
// printf("Y_H equals: %d\r", b);
int c = wiringPiI2CReadReg8(fd,0x28);
int d = wiringPiI2CReadReg8(fd,0x29);
// printf("X_L equals: %d\r", c);
// printf("X_H equals: %d\r", d);
int e = wiringPiI2CReadReg8(fd,0x2C);
int f = wiringPiI2CReadReg8(fd,0x2D);
// printf("Z_L equals: %d\r", e);
// printf("Z_H equals: %d\r", f);
// printf("The temperature is: %d\r", t);
delay(2000);
}
};
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie
\r
zu Ihrem printf wie schon andere gesagt haben.Auch, stellen Sie sicher, Spülen Sie stdout als Standardausgabe-stream gepuffert ist & wird nur angezeigt, was in die Puffer nach dem es reicht ein Zeilenumbruch.
In Ihrem Fall:
fflush
ist ein wichtiger Hinweis, wie auf den meisten Plattformen funktioniert es nicht ohne diese.Du suchst einen Wagenrücklauf. In C, das ist
\r
. Dies bringt den cursor wieder an den Anfang der aktuellen Zeile, ohne eine neue Zeile (Zeilenvorschub)flush
die Linie.\r
ich kommentiert habe alle anderen Zeilen mit Ausnahme eines im inneren desfor
Schleife, aber alles, was ich bekommen ist der blinkende cursor\r
am Anfang derprintf
string anstatt am Ende. Es ist möglich, dass der Wagen zurück ist, wischen Sie die Linie auf dem terminal.\n
Methodefflush
wie bereits von Zaxter unten.Können Sie es mit "\r" anstelle von "\n".
Gedruckt wo?
Wenn Ihr sind die Ausgabe-Daten an die standard-Ausgabe, Sie können nicht in der Regel kommen Sie zurück und ändern alles, was bereits geschrieben wurde. Wenn Ihr standard-Ausgabe richtet sich an terminal, können Sie versuchen, die Ausgabe
\r
Zeichen, wird der cursor an den Anfang der Zeile, an einige Klemmen (der Effekt ist Plattform-abhängig), so dass die nachfolgende Ausgabe-Zeile überschrieben wird, was gedruckt wurde, in der Zeile zuvor. Dieses produziert einen visuellen Effekt von alten Daten durch neue Daten. Allerdings bedeutet dies nicht wirklich "ersetzen" der alten Daten in den stream, was bedeutet, dass, wenn Sie die Umleitung der standard-Ausgabe in Datei speichern alles, was gedruckt wurde. Beachten Sie wieder, dass\r
zwingen wird, überschreiben Sie die gesamte Zeile auf dem terminal.Wenn Sie bei der Ausgabe Ihrer Daten in einer Datei, dann können Sie
fseek
Funktion zurück zu gehen, um einige zuvor besuchte Stelle und "start over" von dort, dem überschreiben der Daten in den Prozess.Haben Sie getestet, das '\b' Zeichen (backspace)? Vielleicht funktioniert je nach Konsole.
Drucken Sie sich so viele Zeilenumbrüche wie die Konsole hat. Dies wird effektiv löscht den Bildschirm.
Dies ist eine große link über clearing-Bildschirm in verschiedenen Arten.
Finden Sie in der Beispielcode zu verstehen:
Referenz Blog
Zusätzlich zu den oben genannten Antworten, \r ist eigentlich ein code für das terminal.
c scheint nicht ein Weg, um zu ändern, was auch immer Programm hat bereits in den Standardausgabe-stream.
in output.txt etwas nicht ändern, weil \r bedeutet nicht, dass alles, was für eine txt-Datei.
Aber für das terminal, \r sinnvoll ist. Es behandelt das format und zeigt Sie gut.
Verwendung von terminal-codes tun könnte einige lustige Dinge. wie unten