2013-03-03 24 views
8

Tôi muốn biết nếu có cách nào trong C để ghi đè giá trị hiện có đã được in thay vì tạo dòng mới mỗi lần hoặc chỉ di chuyển qua một khoảng trắng. Tôi cần lấy dữ liệu thời gian thực từ một cảm biến và muốn nó chỉ ngồi đó và tiếp tục cập nhật các giá trị hiện tại mà không cần cuộn. Điều này có thể không?Cập nhật giá trị printf trên cùng một dòng thay vì mới

UPDATE: thêm mã

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

Trả lời

1

Bạn có thể in ra như nhiều dòng mới như màn hình giao diện điều khiển có. Điều này sẽ xóa màn hình một cách hiệu quả.

Đây là một tuyệt vời link về cách xóa màn hình theo các cách khác nhau.

19

Bạn đang tìm kiếm khoản trả lại bằng xe ngựa. Trong C, đó là \r. Thao tác này sẽ đưa con trỏ trở lại phần đầu của dòng hiện tại mà không bắt đầu một dòng mới (linefeed)

+1

Một vấn đề thú vị sẽ xảy ra nếu dòng mới được in là ngắn hơn dòng in trước đó. Trong trường hợp này, sẽ có một số phần của dòng trước đó cũng hiển thị trên màn hình. – Ganesh

+1

@Ganesh Sau đó, chỉ cần in một khoảng trống bổ sung cho mỗi char. –

+0

@Armin Có đó là một chương trình solution.The sẽ phải biết chiều dài chuỗi và sau đó làm một số toán học để thêm không gian để làm cho nó trông thích hợp. Thách thức là nếu có bất kỳ cách nào khác để có hiệu quả 'tuôn ra 'dòng. – Ganesh

1

Bạn đã thử nghiệm ký tự '\ b' (backspace) chưa? Có thể hoạt động tùy thuộc vào giao diện điều khiển của bạn.

4

Bạn có thể thực hiện việc này bằng cách sử dụng "\ r" thay vì "\ n".

2

Được in ở đâu?

Nếu bạn xuất dữ liệu ra đầu ra tiêu chuẩn, bạn thường không thể quay lại và thay đổi bất kỳ nội dung nào đã được ghi. Nếu đầu ra tiêu chuẩn của bạn được chuyển tới đầu cuối, bạn có thể thử xuất \r ký tự sẽ di chuyển con trỏ đến đầu dòng trên một số đầu cuối (hiệu ứng phụ thuộc vào nền tảng), sao cho dòng đầu ra tiếp theo sẽ ghi đè nội dung được in dòng đó trước đây. Điều này sẽ tạo ra một hiệu ứng hình ảnh của dữ liệu cũ được thay thế bằng dữ liệu mới. Tuy nhiên, điều này không thực sự "thay thế" dữ liệu cũ trong luồng, có nghĩa là nếu bạn chuyển hướng đầu ra tiêu chuẩn vào tệp, tệp sẽ lưu trữ mọi thứ đã được in. Hãy nhớ lại rằng \r sẽ buộc bạn ghi đè toàn bộ dòng trên thiết bị đầu cuối.

Nếu bạn xuất dữ liệu của mình thành tệp, bạn có thể sử dụng chức năng fseek để quay lại một số điểm truy cập trước đó và "bắt đầu lại" từ đó, ghi đè dữ liệu trong quy trình.

11

Bạn nên thêm \r vào printf của mình như những người khác đã nói. Ngoài ra, hãy chắc chắn rằng bạn tuôn ra stdout, như dòng stdout được đệm & sẽ chỉ hiển thị những gì trong bộ đệm sau khi nó đạt đến một dòng mới.

Trong trường hợp của bạn:

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

'fflush' là một lưu ý quan trọng, như trên hầu hết các nền tảng, nó không hoạt động mà không có điều này. – BeeOnRope

+0

Ngay cả ví dụ này không hoạt động khi cố gắng sử dụng để đăng nhập vào giao diện điều khiển của Xcode 9 (và có lẽ là OS X nói chung). – user501138

0

Hãy tham khảo những mẫu mã để hiểu:

#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

Các vấn đề liên quan