नए

2013-03-03 10 views
8

की बजाय उसी पंक्ति पर प्रिंटफ मान अपडेट करें, मैं जानना चाहता हूं कि C में कोई मौजूदा तरीका ओवरराइट करने के लिए कोई तरीका है जो पहले से ही एक नई लाइन बनाने या बस एक स्थान पर जाने के बजाय मुद्रित किया गया है। मुझे एक सेंसर से वास्तविक समय डेटा प्राप्त करने की आवश्यकता है और यह बस वहां बैठना चाहेंगे और बिना किसी स्क्रॉल किए मौजूदा मानों को अपडेट करना जारी रखेगा। क्या यह संभव है?नए

अद्यतन: में कोड

#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

आप एक कैरिज रिटर्न की तलाश में हैं। सी में, यह \r है। यह कर्सर को एक नई लाइन (लाइनफीड)

+1

एक दिलचस्प समस्या होगी पहले मुद्रित लाइन। इस मामले में, पिछली लाइन का कुछ हिस्सा भी स्क्रीन पर दिखाई देगा। – Ganesh

+1

@ गणेश तो बस हर चार के लिए एक अतिरिक्त सफेद जगह मुद्रित करें। –

+0

@Armin हां यह एक समाधान है। कार्यक्रम को स्ट्रिंग लम्बाई जाननी होगी और इसके बाद कुछ गणित को उचित दिखने के लिए रिक्त स्थान जोड़ने के लिए करना होगा। चुनौती यह है कि लाइन को प्रभावी रूप से 'फ्लश' करने का कोई अन्य तरीका है। – Ganesh

1

शुरू किए बिना वर्तमान लाइन की शुरुआत में ले जाएगा। क्या आपने '\ b' वर्ण (बैकस्पेस) का परीक्षण किया है? शायद आपके कंसोल के आधार पर काम करता है।

4

आप इसे "\ n" के बजाय "\ r" का उपयोग करके कर सकते हैं।

2

मुद्रित कहाँ?

यदि आप मानक आउटपुट में डेटा आउटपुट कर रहे हैं, तो आप आम तौर पर वापस नहीं आ सकते हैं और जो कुछ भी पहले ही लिखा जा चुका है उसे बदल सकते हैं। यदि आपका मानक आउटपुट टर्मिनल पर निर्देशित है, तो आप \r कैरेक्टर को आउटपुट करने का प्रयास कर सकते हैं जो कर्सर को कुछ टर्मिनलों (प्रभाव प्लेटफ़ॉर्म-निर्भर) पर लाइन की शुरुआत में ले जायेगा, ताकि बाद की आउटपुट लाइन मुद्रित की गई हो जो ओवरराइट हो जाए वह रेखा पहले। यह पुराने डेटा के नए डेटा के साथ प्रतिस्थापित होने का एक दृश्य प्रभाव उत्पन्न करेगा। हालांकि, यह स्ट्रीम में पुराने डेटा को वास्तव में "प्रतिस्थापित नहीं" करता है, जिसका अर्थ है कि यदि आप मानक आउटपुट को फ़ाइल में रीडायरेक्ट करते हैं, तो फ़ाइल मुद्रित की गई सभी चीज़ों को संग्रहीत करेगी। फिर से ध्यान रखें, \r आपको टर्मिनल पर पूरी लाइन को ओवरराइट करने के लिए मजबूर करेगा।

यदि आप किसी फ़ाइल में अपना डेटा आउटपुट करते हैं, तो आप प्रक्रिया में डेटा को ओवरराइट करते हुए, पहले से देखे गए बिंदु पर वापस जाने के लिए fseek फ़ंक्शन का उपयोग कर सकते हैं और वहां से "प्रारंभ करें" का उपयोग कर सकते हैं।

11

आपको अपने प्रिंटफ में \r जोड़ना चाहिए जैसा कि अन्य ने कहा है। इसके अलावा, सुनिश्चित करें कि आप stdout फ्लश करें, क्योंकि stdout स्ट्रीम buffered & केवल एक नई लाइन तक पहुंचने के बाद बफर में क्या प्रदर्शित करेगा।

आपके मामले में:

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

'fflush' एक महत्वपूर्ण नोट है, क्योंकि अधिकांश प्लेटफॉर्म पर यह इसके बिना काम नहीं करता है। – BeeOnRope

+0

एक्सकोड 9 (और शायद सामान्य रूप से ओएस एक्स) के कंसोल में लॉगिंग के लिए उपयोग करने का प्रयास करते समय भी यह उदाहरण काम नहीं करता है। – 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