2012-06-23 14 views
5

मैं सी ++ टेक्स्ट आउटपुट स्ट्रीम के लिए एक टैब जैसी क्षमता प्रदान करना चाहता हूं। इस सुविधा को मुझे "इस स्थिति को नोट करें" कहने की अनुमति देनी चाहिए, फिर एकाधिक सम्मिलन संचालन की अनुमति दें, और आखिरकार मुझे "पर्याप्त भरने वाले वर्ण जोड़ें ताकि मूल रूप से नोट की गई स्थिति के पिछले N वर्ण समाप्त हो सकें"।क्यों cout.tellp हमेशा -1 लौटाता है?

मानक iostream सिस्टम कॉलम स्थिति बनाए रखने के लिए प्रतीत नहीं होता है, लेकिन मैंने सोचा था कि मैं इसे tellp() का उपयोग करके नकली बना सकता हूं। मेरी धारणा यह थी कि मेरे आउटपुट अनुक्रम में दो बिंदुओं पर tellp() के बीच अंतर बाइट्स को हस्तक्षेप करने की संख्या के अनुरूप होगा।

दुर्भाग्य से, कम से कम मेरे जीएनयू सी ++ पर्यावरण में, cout स्ट्रीम स्थिति की कथा को बनाए रखता नहीं है। प्रत्येक cout.tellp() कॉल returns -1 पर कॉल करें। ऐसा क्यों है?

+6

'tellp' किसी भी स्ट्रीम में एक स्तंभ स्थिति कभी नहीं है। यह तलाशने योग्य धाराओं में केवल सार्थक है। –

+1

@ आर। मार्टिनिन्हो फर्नांडीस सही है। 'टेलप' आपको यह बताने वाला है कि वर्तमान स्थिति पर वापस जाने के लिए 'तलाश' को कौन सा मूल्य प्रदान करना है। इस मामले में, यह आपको बता रहा है कि ऐसी कोई संभावना नहीं है। Entabbing को किसी अन्य तरीके से समर्थित किया जाना है। –

+0

दोनों धन्यवाद। यह तलाशने का रिश्ता था कि मैं समझने में नाकाम रहा। –

उत्तर

2

टेलप एक स्ट्रीम में एक स्थिति देता है ताकि आप इसे खोज सकें। कंसोल मांगने की अनुमति नहीं देता है। इसके अलावा, यहां तक ​​कि आप स्थिति को "धारा में लिखे गए बाइट्स की संख्या" के रूप में भी समझते हैं, यह संख्या कर्सर पोजिशनिंग के लिए किसी भी उपयोग की नहीं होगी - स्क्रीन चारों ओर लपेटती है, इसकी चौड़ाई आम तौर पर अप्रत्याशित होती है। पंक्ति की लंबाई परिवर्तनीय होने के बाद से आप बस यह नहीं जान पाएंगे कि आप किस कॉलम पर हैं।

यदि आप स्क्रीन पर उचित कर्सर स्थिति चाहते हैं, तो एएनएसआई टर्मिनल विनिर्देश देखें और इसके साथ आने वाले आदेशों से बचें। वे कर्सर की स्थिति की खोज और प्लेसमेंट की अनुमति देते हैं।

http://ascii-table.com/ansi-escape-sequences.php

+0

धन्यवाद सेवा। यह तलाश और बताने के बीच का रिश्ता था कि मैं समझने में नाकाम रहा। –

+0

धन्यवाद @ सेवा। मैं कर्सर हेरफेर करने की कोशिश नहीं कर रहा हूं। Alignmnet के लिए मैं बस फिक्स्ड चौड़ाई कॉलम (जैसे "1:" और "12:") में पीछे विराम चिह्न के साथ बाएं उचित मानों को उत्सर्जित करना चाहता था। क्योंकि इसमें अधिक शामिल होता है कि एक एकल सम्मिलन ऑपरेशन मानक चौड़ाई() मैनिपुलेटर अपर्याप्त है। यदि आप मेरा मूल प्रश्न दोबारा पढ़ लेंगे तो आप देखेंगे कि मैं कॉलम स्थिति के रूप में tellp() को समझने का इरादा नहीं रखता था। यह बताए जाने के लिए दो कॉल के बीच अंतर था() जो मुझे उम्मीद थी कि मुझे यह निर्धारित करने की अनुमति होगी कि उनके बीच कितने बाइट डाले गए थे। –

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