2013-03-03 10 views
8

新しい行を毎回作成するか、スペースを移動する代わりに、既に印刷されている既存の値を上書きする方法があるかどうかを知りたいと思います。私はセンサーからリアルタイムのデータを取得する必要があり、そこに座ってスクロールせずに既存の値を更新し続けたいと思っています。これは可能ですか?新しい行の代わりに同じ行に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それから、すべての文字に対して追加の空白を表示するだけです。 –

+0

@Arminはい、それは解決策です。プログラムは、文字列の長さを知ってから、それが適切に見えるようにスペースを追加するために数学を行う必要があります。問題は、行を効果的に 'フラッシュする'他の方法がある場合です。 – Ganesh

1

「\ b」文字(バックスペース)をテストしましたか?おそらくあなたのコンソールに応じて動作します。

4

「\ n」ではなく「\ r」を使用して実行できます。

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

関連する問題