2011-01-23 13 views
8

मैं सी में प्रोग्राम करना सीख रहा हूं और टर्मिनल में अक्षरों को टाइप करने में सक्षम होना चाहता हूं, जबकि मेरा कोड पर बिना दबाए चल रहा है। मेरा प्रोग्राम काम करता है, हालांकि जब मैं initscr() पर कॉल करता हूं, तो स्क्रीन साफ़ हो जाती है - filter() पर कॉल करने के बाद भी। filter के लिए प्रलेखन से पता चलता है कि इसे समाशोधन अक्षम करना चाहिए - हालांकि यह मेरे लिए मामला नहीं है।स्क्रीन को साफ़ किए बिना मैं शाप से गेट का उपयोग कैसे करूं?

#include <stdio.h> 
#include <curses.h> 
#include <term.h> 

int main(void) { 

    int ch; 

    filter(); 
    initscr(); 
    cbreak(); 
    noecho(); 
    keypad(stdscr, TRUE); 

    while((ch = getch()) != EOF); 

    endwin(); 

    return 0; 
} 

उपरोक्त कोड अभी भी स्क्रीन को साफ़ क्यों करता है, और इसे ठीक करने के लिए क्या किया जा सकता है?

मैं डेबियन लेनी (स्थिर) और gnome टर्मिनल का उपयोग कर रहा हूं अगर यह मदद करता है।

+0

PDCurses आप वातावरण चर PDC_PRESERVE_SCREEN या PDC_RESTORE_SCREEN किसी मान पर सेट कर सकते हैं के लिए: फ़ाइल का इतिहास से: – Brandin

+0

PDC_PRESERVE_SCREEN इस वातावरण चर हैं सेट है, पीडीसीआरएस स्क्रीन पर स्क्रीन पर स्टार्टअप पर काले रंग के डिफ़ॉल्ट सफेद को साफ़ नहीं करेगा। यह आपको मौजूदा स्क्रीन पृष्ठभूमि के शीर्ष पर एक विंडो ओवरले करने की अनुमति देता है। PDC_RESTORE_SCREEN यदि यह पर्यावरण चर सेट किया गया है, तो PDCurses PDCurses प्रारंभ होने पर स्क्रीन की सामग्री की एक प्रति ले जाएगा; initscr(), और जब एंडविन() कहा जाता है, तो स्क्रीन को पुनर्स्थापित किया जाएगा। – Brandin

उत्तर

2

initscr() के बजाय newterm() का उपयोग करें, तो आपको ठीक होना चाहिए। और यदि आप इस सलाह का पालन करते हैं तो delscreen() को न भूलें।

+0

हाय, प्रतिक्रिया के लिए धन्यवाद, मैंने जो कहा है मैंने कोशिश की है और कार्यक्षमता एक जैसी है - स्क्रीन को फिर से साफ़ कर दिया गया था। 'Initscr()' के स्थान पर मेरे पास 'FILE * fild_id = fopen ("/dev/tty "," r + ") है; स्क्रीन * termref = newterm (NULL, file_id, file_id); 'और' endwin() 'के बजाय' मेरे पास 'delscreen (termref) 'है। –

+0

अजीब लेकिन जब मैं 'initscr()' के बजाय इसका उपयोग करता हूं तो यह मेरी स्क्रीन को साफ़ नहीं करता है। मैं इसे 'newterm (NULL, stdin, stdout) के रूप में बुलाता हूं। –

+3

एकमात्र कारण यह आपकी स्क्रीन को साफ़ नहीं कर रहा है, माइक, यह है कि आपने तर्क को newterm() में उलट दिया है। यह stdout, stdin, stdin, stdout लेता है। आपके परीक्षण कार्यक्रम के बाद मैं शर्त लगाता हूं, आपका इनपुट गड़बड़ हो गया है? गूंज नहीं है, शायद? यदि आप newterm() के लिए सही तर्क आदेश का उपयोग करते हैं तो यह वास्तव में स्क्रीन को साफ़ करता है। आपका जवाब सिर्फ गलत है। –

4

mike.dld द्वारा उत्तर का विस्तार, यह सिस्टम curses लाइब्रेरी के साथ मैकोज़ एक्स 10.6.6 (जीसीसी 4.5.2) पर मेरे लिए काम करता है - स्क्रीन को साफ़ किए बिना। मैंने टाइप किए गए अक्षरों को रिकॉर्ड करने की क्षमता (फ़ाइल "x" पर लॉग इन करने की क्षमता), और CONTROL-D टाइप करने की क्षमता और उपयोगकर्ता को बाधित करने के लिए प्रोग्राम को रोकने की क्षमता को जोड़ा।

#include <stdio.h> 
#include <curses.h> 
#include <term.h> 

#define CONTROL(x) ((x) & 0x1F) 

int main(void) 
{ 
    FILE *fp = fopen("x", "w"); 
    if (fp == 0) 
     return(-1); 
    SCREEN *s = newterm(NULL, stdin, stdout); 
    if (s == 0) 
     return(-1); 
    cbreak(); 
    noecho(); 
    keypad(stdscr, TRUE); 

    int ch; 
    while ((ch = getch()) != EOF && ch != CONTROL('d')) 
     fprintf(fp, "%d\n", ch); 

    endwin(); 

    return 0; 
} 
+0

उत्तर देने के लिए धन्यवाद दोस्तों, यह पूरी तरह से काम किया –

+0

यह मेरे लिए स्क्रीन साफ़ करता है (इसलिए यह काम नहीं करता है)। – nh2

+0

@ nh2: यह आपके टर्मिनल प्रकार और आपके द्वारा उपयोग की जाने वाली शाप प्रविष्टि पर निर्भर हो सकता है। –

0

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

मैं सुझाव देता हूं कि या तो पूरे कार्यक्रम में शाप का उपयोग करने के लिए या फिर रीडलाइन जैसे विकल्पों की जांच करने के लिए अपने प्रोग्राम को फिर से लिखना होगा।

+0

रीडलाइन आंतरिक रूप से ncurses का उपयोग करता है। –

+1

रीडलाइन केवल टर्मकैप इंटरफेस का उपयोग करता है –

1

आप अपने स्क्रीन इन कारणों में से एक के लिए एक शाप आवेदन में मंजूरी दे दी देखेंगे:

  • अपने कार्यक्रम initscr (जो स्क्रीन को साफ करता है) या newterm कॉल पहले filter बुला बिना, या
  • टर्मिनल आरंभीकरण स्क्रीन को साफ़ करता है (या वैकल्पिक स्क्रीन पर स्विच करके इसे स्पष्ट करता है)।

उत्तरार्द्ध मामले में, आप enter_ca_mode और exit_ca_mode संकेत रीसेट करने as done in dialog शून्य पर से ncurses में वैकल्पिक स्क्रीन सुविधा को दबाने कर सकते हैं। बेहतर अभी तक, एक टर्मिनल विवरण चुनें जो आप चाहते हैं।

अतिरिक्त पठन:

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

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