2013-03-03 16 views
8

Chciałbym wiedzieć, czy istnieje sposób w C do zastąpienia istniejącej wartości, która została już wydrukowana, zamiast tworzenia nowej linii za każdym razem lub po prostu przesuwania się po spacji. Potrzebuję uzyskać dane z czujnika w czasie rzeczywistym i chciałbym, aby po prostu siedział i aktualizował istniejące wartości bez żadnego przewijania. czy to możliwe?Zaktualizuj wartość printf w tym samym wierszu zamiast nowego

UPDATE: Kod

#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); 
} 
}; 

Odpowiedz

1

można wydrukować dowolną liczbę nowych linii, jak ekran konsoli ma. Spowoduje to skuteczne wyczyszczenie ekranu.

To jest świetny link o czyszczeniu ekranu na różne sposoby.

19

Poszukujesz zwrotu karetki. W języku C jest to \r. Spowoduje to przesunięcie kursora z powrotem do początku bieżącej linii bez rozpoczynania nowej linii (podawanie do linii).

+1

Interesującym problemem byłoby, gdyby nowa linia do wydrukowania jest krótszy niż poprzednio wydrukowana linia. W takim przypadku część poprzedniej linii będzie widoczna również na ekranie. – Ganesh

+1

@Ganesh Następnie po prostu wydrukuj dodatkowe spacje dla każdego znaku. –

+0

@Armin Tak, to jest rozwiązanie. Program będzie musiał znać długość ciągu, a następnie zrobić trochę matematyki, aby dodać spacje, aby wyglądały poprawnie. Wyzwanie polega na tym, że istnieje inny sposób skutecznego "przepłukania" linii. – Ganesh

1

Czy testowałeś znak \ b (backspace)? Może działa w zależności od konsoli.

4

Możesz to zrobić, używając "\ r" zamiast "\ n".

2

Wydrukowano gdzie?

Jeśli dane wyjściowe są wysyłane na standardowe wyjście, zwykle nie można wrócić i zmienić niczego, co zostało już napisane. Jeśli twoje standardowe wyjście jest kierowane do terminala, możesz spróbować wypisać znak \r, który przesunie kursor na początek linii na niektórych terminalach (efekt zależy od platformy), tak aby kolejna linia wyjściowa nadpisała to, co zostało wydrukowane poprzednia linia. To spowoduje wizualny efekt zastąpienia starych danych nowymi danymi. Jednak tak naprawdę nie "zastępuje" starych danych w strumieniu, co oznacza, że ​​jeśli przekierujesz standardowe wyjście do pliku, plik zapisze wszystko, co zostało wydrukowane. Pamiętaj, że \r wymusi zastąpienie całej linii na terminalu.

Jeśli wypiszesz dane do pliku, możesz użyć funkcji fseek, aby powrócić do wcześniej odwiedzonego punktu i "zacząć od nowa", zastępując dane w procesie.

11

Powinieneś dodać \r do printf, jak powiedzieli inni. Pamiętaj też o tym, abyś wypróżnił standardowe wyjście, ponieważ strumień stdout jest buforowany, tylko & wyświetli tylko zawartość bufora po dojściu do znaku nowej linii.

W twoim przypadku:

for (int i=0;i<10;i++){ 
    //... 
    printf("\rValue of X is: %d", x/114); 
    fflush(stdout); 
    //... 
} 
+2

"fflush" jest kluczową informacją, ponieważ na większości platform nie działa bez tego. – BeeOnRope

+0

Nawet ten przykład nie działa przy próbie użycia do zalogowania się w konsoli Xcode 9 (a może ogólnie w systemie OS X). – user501138

0

zapoznać się z przykładowym kodem do zrozumienia:

#include <stdio.h> 
#include <pthread.h> 

void myThread(void* ptr) { 
    printf("Hello in thread\n"); 
    int i=0;  
    for(;i<10;i++) 
    { 
     sleep(1); 
     printf(". "); 
     fflush(stdout); //comment this, to see the difference in O/P 
    } 
    printf("sleep over now\n"); 
} 

int main(void) { 
    pthread_t tid; 
    printf("creating a new thread\n"); 
    pthread_create(&tid, NULL, (void*)myThread, 0); 
    printf("going to join with child thread..\n"); 
    pthread_join(tid, NULL); 
    printf("joined..!!\n"); 
    return 0; 
} 

Reference Blog

Powiązane problemy