2011-01-16 16 views
13

istream::getline विधि वापसी क्या करती है?आईएसट्रीम :: गेटलाइन रिटर्न टाइप

while (file.getline(char*, int)) 
{ 
    // handle input 
} 

क्या वापस आ जा रहा है:

मैं एक फ़ाइल के माध्यम से पूछ रहा हूँ क्योंकि मैं पाश करने के लिए देखा है कि यह इस प्रकार किया जाना चाहिए?

+0

आईट्रीम और वापसी प्रकार है। – DumbCoder

+0

हाँ, मुझे कहना चाहिए था कि मुझे पहले से ही पता है। लेकिन जाहिर है कि इसके बारे में कुछ अजीब बात है, क्योंकि कुछ प्रकार का सत्य या झूठा इसे से लिया गया है। –

+0

यह या तो 'बूल' या' शून्य * 'ऑपरेटरों को अधिभारित करता है ताकि जब यह स्पष्ट रूप से if() स्थिति में डाला जाता है, तो यह वापस लौटा सकता है कि ईओएफ पहुंच गया है या नहीं – Cameron

उत्तर

15

यह एक स्ट्रीम देता है ताकि हम ऑपरेशन को श्रृंखलाबद्ध कर सकें।

लेकिन जब आप एक बूलियन संदर्भ में किसी ऑब्जेक्ट का उपयोग करते हैं तो संकलक एक रूपांतरण ऑपरेटर की तलाश करता है जो इसे एक प्रकार में परिवर्तित कर सकता है जिसे बूलियन संदर्भ में उपयोग किया जा सकता है।

इस मामले में धारा operator void*() है। चूंकि इसका परिणाम एक सूचक में होता है, इसका उपयोग बुलियन संदर्भ में किया जा सकता है। जब इसे बुलाया जाता है तो त्रुटि झंडे की जांच करता है। यदि या तो असफलता या बैडबिट सेट की जाती है तो यह न्यूल लौटाती है जो गलत के बराबर होती है अन्यथा यह स्वयं को पॉइंटर देता है (या कुछ और मान्य है हालांकि आपको इस तथ्य का उपयोग नहीं करना चाहिए)।

तो आप किसी भी संदर्भ में एक धारा है कि एक बूलियन परीक्षण की आवश्यकता होगी का उपयोग कर सकते हैं:

if (stream >> x) 
{  
} 

while(stream) 
{ 
    /* do Stuff */ 
} 

ध्यान दें: यह बुरा विचार बाहर की दुनिया में धारा का परीक्षण और फिर पढ़ने/शरीर के अंदर यह करने के लिए लिखने के लिए है सशर्त/पाश कथन का। ऐसा इसलिए है क्योंकि पढ़ने का कार्य धारा को खराब कर सकता है। परीक्षण के हिस्से के रूप में पढ़ना आमतौर पर बेहतर होता है।

while(std::getline(steam, line)) 
{ 
    // The read worked and line is valid. 
} 
5

reference से देखें। ऑपरेशन की सफलता की जांच के लिए getline से आईट्रीम लौटाया गया है implicit conversion द्वारा बूल में परिवर्तित किया गया है। यह रूपांतरण का उपयोग if(!mystream.getline(a,b).fail()) के लिए शॉर्टेंड में करता है। ,

myStream.getline(...).getline(...); 

या क्योंकि धाराओं, परोक्ष void * रों के लिए परिवर्तनीय हैं एक पाश या हालत में:

+0

आपके लिंक में आपके कथन के साथ कुछ भी नहीं है। – iheanyi

+0

@hiheanyi स्पष्टीकरण जोड़ा गया, शायद समय के साथ पेज बदल गए हैं। –

+0

धन्यवाद, मैंने उस परिवर्तन के साथ आपका उत्तर उभारा। – iheanyi

2

समारोह धारा वस्तु ही है, जो आगे के संचालन को पढ़ने श्रृंखला के लिए या तो किया जा सकता है के लिए एक संदर्भ रिटर्न:

while (myStream.getline(...)) { 
    ... 
} 

आप cplusplus.com वेबसाइट पर इस बारे में और अधिक पढ़ सकते हैं:

http://cplusplus.com/reference/iostream/istream/getline/

2

यह स्ट्रीम स्वयं ही देता है। धारा बदल सकती है (void* के माध्यम से) bool अपने राज्य को इंगित करती है। इस उदाहरण में, while लूप समाप्त हो जाएगा जब स्ट्रीम का रूपांतरण bool पर "झूठा" हो जाता है, जो तब होता है जब आपकी स्ट्रीम त्रुटि स्थिति में प्रवेश करती है। आपके कोड में, फ़ाइल के अंत से पहले पढ़ने का प्रयास होने पर यह संभवतः होने की संभावना है। संक्षेप में, यह उतना ही पढ़ेगा जितना है, और फिर रुकें।

+0

+1। यह बूल में परिवर्तित हो सकता है क्योंकि यह 'ऑपरेटर बूल() '(या' ऑपरेटर शून्य *() 'को ओवरलोड करता है, यह सुनिश्चित नहीं करता कि) – Cameron

+0

@ कैमरॉन: यह' ऑपरेटर शून्य *()' है। –

0

हर कोई तुमसे कहा गया है कि यह क्या है, अब मैं आपको बता दूँ, free form संस्करण

std::string line; 
while(getline(file, line)) // assuming file is an instance of istream 
{ 
// 
} 

क्यों इस संस्करण का उपयोग करते हैं? यह तुरंत स्पष्ट होना चाहिए - आप कुछ निश्चित आकार चरित्र बफर के बजाय std::string में गुजरते हैं!

+0

लेकिन यदि आप 'std :: string' के बजाय' char * 'चाहते हैं तो क्या होगा? वह स्थिति है जिसमें मैं हूं। –

+0

'std :: string' में 'c_str()' विधि है जो आपको आवश्यकतानुसार वापस कर देगी, यदि आपको स्ट्रिंग को संशोधित करने की आवश्यकता है, तो' std :: string' के तरीके हैं आप इसे संशोधित करने के लिए उपयोग कर सकते हैं। – Nim

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