2008-10-13 41 views

Trả lời

19

Bạn có thể sử dụng ký tự phím lùi (\b) như thế này:

printf("processing... |"); 
fflush(stdout); 
// do something 
printf("\b/"); 
fflush(stdout); 
// do some more 
printf("\b-"); 
fflush(stdout); 

vv Bạn cần fflush(stdout) vì thông thường stdout được đệm cho đến khi bạn ra một dòng mới.

2

Tôi đã làm điều đó, từ lâu. Có hai cách.

  1. Sử dụng thư viện như ncurses để cung cấp cho bạn quyền kiểm soát thiết bị đầu cuối. Điều này hoạt động tốt nếu bạn muốn làm rất nhiều loại công cụ này. Nếu bạn chỉ là một trong những điểm này, nó rõ ràng là quá mức cần thiết.

  2. In ký tự điều khiển.

Trước tiên, bạn in "/", sau đó 0x08 (backspace), sau đó "-", sau đó 0x08, sau đó "\" ....

Nhân vật BackSpace di chuyển vị trí con trỏ trở lại một không gian , nhưng để lại ký tự hiện tại ở đó cho đến khi bạn ghi đè lên nó. Lấy đúng thời gian (để nó không quay nhanh hay chậm) và bạn vàng.

+1

Không có nhu cầu sử dụng 0x08, nguồn cung cấp tiêu chuẩn C '\ b' cho một backspace, và điều này sẽ làm việc một cách độc lập của nhân vật bộ. 0x08 giả định ASCII. – Chris

+0

@ Chris Young: Tôi thấy rằng trong các bài viết khác sau khi tôi đã thực hiện của tôi. Tôi đã không phải làm điều này quá lâu, tôi không nhớ nó là gì. Tôi nhìn vào một bảng ASCII để tìm số, nhưng bảng không có phím tắt. – MBCook

1

Không có cách "chuẩn" thực sự để làm điều này, vì Thư viện chuẩn C (http://members.aol.com/wantondeb/) không cung cấp chức năng để thực hiện đầu ra/đầu cuối của bàn điều khiển thô.

Trong DOS/Windows giao diện điều khiển, cách chuẩn ish để làm điều đó là với conio.h, trong khi dưới Unix/Linux thư viện chấp nhận cho mục đích này là ncurses (ncurses về cơ bản đóng gói hành vi điều khiển nhân vật mà MBCook mô tả, trong một cách độc lập thiết bị đầu cuối).

10

Dưới đây là một số mã ví dụ. Gọi before_cursor() mỗi lần trong khi nhiệm vụ hoàn thành.

#include <stdio.h> 

void advance_cursor() { 
    static int pos=0; 
    char cursor[4]={'/','-','\\','|'}; 
    printf("%c\b", cursor[pos]); 
    fflush(stdout); 
    pos = (pos+1) % 4; 
} 

int main(int argc, char **argv) { 
    int i; 
    for (i=0; i<100; i++) { 
    advance_cursor(); 
    usleep(100000); 
    } 
    printf("\n"); 
    return 0; 
} 
+0

nó không hoạt động mà không có #include

+0

@JemshitIskenderov câu hỏi là về "Chuẩn C", mà Windows chắc chắn là không. Điều này sẽ làm việc với C chuẩn miễn là ký tự '\ b' được hỗ trợ. Nhận xét của bạn là chính xác cho những người sử dụng Windows, nhưng OP không nói rằng anh ta ... chỉ muốn chỉ ra điều đó. – RastaJedi

+0

@JemshitIskenderov chỉ có chức năng '' 'Windows.h''' trong mã này là' '' usleep'''. –

2

Bạn cũng có thể sử dụng \ r:

#include <stdio.h> 
#include <unistd.h> 

void 
advance_spinner() { 
    static char bars[] = { '/', '-', '\\', '|' }; 
    static int nbars = sizeof(bars)/sizeof(char); 
    static int pos = 0; 

    printf("%c\r", bars[pos]); 
    fflush(stdout); 
    pos = (pos + 1) % nbars; 
} 

int 
main() { 
    while (1) { 
     advance_spinner(); 
     usleep(300); 
    } 

    return 0; 
} 
+0

Điều này là tốt, nhưng nếu bạn sử dụng '\ r' thì nó sẽ trở về đầu dòng - không phải lúc nào cũng là hành vi mong muốn! '\ b' hoạt động như mong đợi. –

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