2008-09-05 5 views
13

मेरे पास एक कंसोल ऐप है जिसे आइटम की स्थिति प्रदर्शित करने की आवश्यकता है, लेकिन पागल की तरह टेक्स्ट स्क्रॉल करने की बजाय मैं वर्तमान स्थिति को उसी पंक्ति पर दिखाना चाहता हूं। उदाहरण के लिए:तृतीय पक्ष लाइब्रेरी का उपयोग किये बिना, मैं Windows मूल C++ कंसोल ऐप में कंसोल के उसी हिस्से को ओवरराइट कैसे कर सकता हूं?

Running... nn% complete
Buffer size: bbbb bytes

उत्पादन, जहां 'nn' वर्तमान प्रतिशत पूरा हो गया है, और 'bbbb' होना चाहिए एक बफर आकार, पर समय समय पर अद्यतन है कंसोल की एक ही पंक्तियां।

नए दृष्टिकोण को मुद्रित करने से पहले मैंने जो पहला दृष्टिकोण लिया था, वह कंसोल में सही संख्या में बैकस्पेस को मुद्रित करता था, लेकिन इसमें एक अप्रिय झिलमिलाहट है जिसे मैं छुटकारा दिलाना चाहता हूं। मैं मानक पुस्तकालय या एमएस-प्रदत्त कार्यक्षमता (वीसी 8) से भी चिपकना चाहता हूं ताकि इस सरल आवश्यकता के लिए एक और निर्भरता न पेश की जा सके।

उत्तर

8

आप SetConsoleCursorPosition उपयोग कर सकते हैं। आउटपुट बफर को हैंडल प्राप्त करने के लिए आपको GetStdHandle पर कॉल करने की आवश्यकता होगी।

+0

अधिक जानकारी के लिए मेरा उत्तर देखें, लेकिन मेरे साधारण मामले के लिए यह सबसे आसान तरीका था। –

0

लिनक्स में, आप इसे \ b और/या \ r stderr प्रिंट करके पूरा कर सकते हैं। आपको विंडोज़ में चीजों के सही संयोजन को खोजने के लिए प्रयोग करने की आवश्यकता हो सकती है।

5

यदि आप \ r का उपयोग करके प्रिंट करते हैं और एक फ़ंक्शन का उपयोग नहीं करते हैं जो एक नई लाइन उत्पन्न करेगा या अंत में \ n जोड़ देगा, तो कर्सर लाइन की शुरुआत में वापस जाएगा और आपके द्वारा डाली गई अगली चीज़ पर प्रिंट करें अप। मुद्रण से पहले पूरी स्ट्रिंग उत्पन्न करना झिलमिलाहट को भी कम कर सकता है।

अद्यतन: प्रश्न के बजाय 1 उत्पादन की 2 पंक्तियाँ जो मेरा उत्तर नहीं रह गया है पूरा करता है में बदल दिया गया। एक और जटिल दृष्टिकोण की आवश्यकता है। जेपी Console API के साथ सही विचार है। मेरा मानना ​​है कि निम्नलिखित साइट में आपके लक्ष्य को पूरा करने के लिए आवश्यक कई चीजें हैं। साइट में यह भी उल्लेख किया गया है कि फ्लिकर को कम करने की कुंजी इसे प्रदर्शित करने से पहले सब कुछ स्क्रीन को प्रस्तुत करना है। जब भी आप स्क्रीन पर कुछ भी प्रदर्शित कर रहे हों तो यह सच है चाहे वह टेक्स्ट या ग्राफिक्स (2 डी या 3 डी) है।

http://www.benryves.com/tutorials/?t=winconsole

6

जोसेफ़, जेपी, और कोडिंग वेहेल सभी ने मूल्यवान सहायता प्रदान की।

मेरी सरल मामले के लिए, सबसे सीधी-सपाट दृष्टिकोण CodingTheWheel's answer के आधार पर किया लग रहा था:

// before entering update loop 
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE); 
CONSOLE_SCREEN_BUFFER_INFO bufferInfo; 
GetConsoleScreenBufferInfo(h, &bufferInfo); 

// update loop 
while (updating) 
{ 
    // reset the cursor position to where it was each time 
    SetConsoleCursorPosition(h, bufferInfo.dwCursorPosition); 

    //... 
    // insert combinations of sprintf, printf, etc. here 
    //... 
} 

और अधिक जटिल समस्याओं के लिए, पूर्ण console API के रूप में के माध्यम से दिए गए उदाहरणों के साथ समन्वय में, JP's answer द्वारा प्रदान की linkJoseph's answer से उपयोगी साबित हो सकता है, लेकिन मुझे CHAR_INFO का उपयोग करने के लिए आवश्यक काम इतना आसान ऐप के लिए बहुत कठिन था।

संबंधित मुद्दे

 संबंधित मुद्दे