2012-06-30 4 views
5

में कमांड लाइन से मुद्रित वर्णों को कैसे हटाएं मैं एक कंपाइलर डाउनलोड कर रहा था (मुझे लगता है कि यह मिनीगू था लेकिन मुझे यकीन नहीं है) विंडोज 2000 पर दूसरे दिन (मैं आम तौर पर मैक उपयोगकर्ता हूं, लेकिन यह ' टी मेरी मशीन), और डाउनलोडर एक एमएस-डॉस कमांड लाइन ऐप था जो डाउनलोड के लिए प्रगति पट्टी प्रदर्शित करेगा। इस तरह कुछ ...सी ++

|---     | 15% 
... 
|------    | 30% 
... 
... 
|--------------  | 70% 

सिवाय इसके कि यह लगातार उसी पंक्ति पर अपडेट होगा। मुझे लगता है कि इस कार्यक्रम ने पहले मुद्रित पात्रों को हटाकर और अलग-अलग पुनर्निर्मित करके इसे पूरा किया, लेकिन मुझे यह पता लगाना प्रतीत नहीं होता कि यह कैसे करें।

मैं एक 'हटाएँ' चरित्र कई अलग अलग तरीकों मुद्रित करने के लिए, (char)8 और \b (\r भी है, जो मैं कुछ भाषाओं में पंक्ति के आरम्भ में backtracks सुना) की तरह की कोशिश की है, लेकिन उन चीजों में से कोई भी काम किया।

क्या किसी को पता है कि इस तरह की चीजें कैसे करें?

संपादित करें: यह प्रश्न मंच-विशिष्ट बन गया है। मैं विशेष रूप से जानना चाहता हूं कि मैक पर इसे कैसे पूरा किया जाए।

+0

क्या 'clrscr' ऐसा करेगा? –

+1

संबंधित: http://stackoverflow.com/questions/60221/how-to-animate-the-command-line?rq=1 – Pubby

+0

clrscr पूरी स्क्रीन को साफ़ कर देगा, और मैक पर यह सब कुछ पर्याप्त न्यूलाइन प्रिंट करेगा स्क्रीन से सब कुछ ले जाएं (जिसका अर्थ है कि आप अभी भी इसे वापस स्क्रॉल कर सकते हैं, जो उपयोगी है, लेकिन परेशान भी है)। – anthropomorphic

उत्तर

2

to Wikipedia अनुसार:

Win32 सांत्वना बिल्कुल एएनएसआई भागने दृश्यों का समर्थन नहीं करता। सॉफ़्टवेयर कंसोल को टेक्स्ट आउटपुट के साथ इंटरऑस किए गए ioctl-like कंसोल एपीआई के साथ जोड़ सकता है। कुछ सॉफ़्टवेयर आंतरिक रूप से प्रिंटिंग में एएनएसआई एस्केप अनुक्रमों को व्याख्या करते हैं और उन्हें इन कॉलों में अनुवादित करते हैं [उद्धरण वांछित]। इस बाहर

की जांच: http://msdn.microsoft.com/en-us/library/ms682073.aspx

मेरा मानना ​​है कि SetConsoleCursorPosition क्या आप पाठ बदलने के लिए अनुमति देता है।

4

मुझे यकीन नहीं है कि आप समस्याओं में क्यों भाग गए हैं, लेकिन ऐसा करने के लिए \b or \r का उपयोग किया जा सकता है, मैंने \b का उपयोग किया है।

#include <iostream> 
#include <iomanip> 
#include <string> 
#include <windows.h> 

// This is the only non-portable part of this code. 
// Simply pause for a specified number of milliseconds 
// For Windows, we just call Sleep. For Linux, you'd 
// probably call nanosleep instead (with a suitable 
// multiplier, of course). Most other systems (presumably) 
// have (at least vaguely) similar capabilities. 
void pause(int ms) { 
    Sleep(ms); 
} 

static const int width = 40;  

void show_percent(int i) { 
    int dashes = (width * i)/100; 

    std::cout << '|' << std::left << std::setw(width) << std::string(dashes, '-') << '|' << std::setw(3) << i << "%"; 
} 

int main() { 

    for (int i=0; i<101; i++) { 
     show_percent(i); 
     std::cout << std::string(width+6, '\b'); 
     pause(100); 
    } 
} 
+0

मेरा मानना ​​है कि सी ++ 11 में ऐसा करने का पोर्टेबल तरीका 'std :: this_thread :: sleep_for (std :: chrono :: मिलीसेकंड (एमएस)) होगा;' – anthropomorphic

+0

मेरा बुरा, मैं बाहर निकल गया। मैं आपके शो_परेंट कोड से इतना प्रभावित था कि मैं यह उल्लेख करना भूल गया कि '\ r' चीज बिल्कुल काम नहीं करती है। मुझे लगता है कि इसे विंडोज़, मैक ओएस एक्स और लिनक्स के तरीके में अंतर के साथ क्या करना पड़ सकता है। – anthropomorphic

+0

@MichaelDorst: हाँ, मैंने इसका उल्लेख तब तक नहीं सोचा जब तक आपने इसका उल्लेख नहीं किया, लेकिन मैक पर, सालों से उन्होंने '\ r'' नए-पंक्ति' चरित्र के रूप में उपयोग किया है, इसलिए शायद यह कोई आश्चर्य की बात नहीं है कि यह नहीं करता वर्तमान लाइन की शुरुआत में वापस न जाएं जैसे कि यह एक सन सिस्टम पर होगा। मेरे पास परीक्षण करने के लिए मैक नहीं है, लेकिन देखें कि ऊपर संशोधित कोड बेहतर काम करता है या नहीं। –