2013-03-03 4 views
8

Я хотел бы знать, есть ли способ в C, чтобы перезаписать существующее значение, которое уже было напечатано, вместо того, чтобы создавать новую строку каждый раз или просто перемещаться по пробелу. Мне нужно получить данные в реальном времени от датчика, и мне хотелось бы просто сидеть там и постоянно обновлять существующие значения без прокрутки. Это возможно?Обновить значение printf в той же строке вместо новой

UPDATE: ДОБАВЛЕНО КОД

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

ответ

1

Вы можете распечатать столько новой строки, как на экране консоли есть. Это позволит эффективно очистить экран.

Это отличный link об очистке экрана по-разному.

19

Вы ищете возврат каретки. В C это \r. Это вернет курсор к началу текущей строки, не запустив новую строку (строка)

+1

Одна интересная проблема будет, если новая линия для печати короче ранее напечатанной линией. В этом случае на экране будет отображаться какая-то часть предыдущей строки. – Ganesh

+1

@Ganesh Затем просто распечатайте дополнительные пробелы для каждого символа. – 2013-03-04 00:06:16

+0

@Armin Да, это решение. Программа должна знать длину строки, а затем делать некоторую математику для добавления пробелов, чтобы она выглядела правильно. Задача состоит в том, есть ли другой способ эффективно «промыть» линию. – Ganesh

1

Вы тестировали символ '\ b' (backspace)? Возможно, работает в зависимости от вашей консоли.

4

Вы можете сделать это, используя «\ r» вместо «\ n».

2

Отпечатано где?

Если вы выводите данные на стандартный вывод, вы обычно не можете вернуться и изменить все, что уже было написано. Если ваш стандартный вывод направлен на терминал, вы можете попробовать вывести символ \r, который переместит курсор в начало строки на некоторых терминалах (эффект зависит от платформы), так что последующая строка вывода перезапишет то, что было напечатано в эта строка ранее. Это приведет к визуальному эффекту замены старых данных новыми данными. Однако это не «заменяет» старые данные в потоке, а это означает, что если вы перенаправите стандартный вывод в файл, файл сохранит все, что было напечатано. Имейте в виду, что \r заставит вас перезаписать всю строку на терминале.

Если вы выводите свои данные в файл, то вы можете использовать функцию fseek, чтобы вернуться к некоторой ранее посещаемой точке и «начать с нее», переписывая данные в процессе.

11

Вы должны добавить \r к вашему printf, как и другие. Кроме того, убедитесь, что вы сбросили stdout, поскольку поток stdout буферизирован & отобразит только то, что находится в буфере после того, как оно достигнет новой строки.

В вашем случае:

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

«fflush» - ключевая нота, так как на большинстве платформ она не работает без этого. – BeeOnRope

+0

Даже этот пример не работает при попытке использовать для входа в консоль Xcode 9 (и, возможно, OS X в целом). – user501138

0

Приведи в образце кода, чтобы понять:

#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

Смежные вопросы