2008-11-03 17 views
25

मेरे पास एक लूप है जो getline() का उपयोग कर फ़ाइल में प्रत्येक पंक्ति को पढ़ता है।std :: getline()

istream is; 
string line; 
while (!getline(is, line).eof()) 
{ 
} 

मैंने देखा बुला getline() इस तरह भी काम करने के लिए लगता है कि:

while (getline(is, line)) 

क्या यहाँ हो रहा है? getline() एक धारा संदर्भ देता है। क्या इसे किसी सूचक में परिवर्तित किया जा रहा है? क्या यह वास्तव में एक अच्छा अभ्यास है या क्या मुझे पहले फॉर्म में रहना चाहिए?

उत्तर

26

गेटलाइन() द्वारा लौटाया गया आईट्रीम इसके ऑपरेटर शून्य *() विधि को स्पष्ट रूप से बुलाया जाता है, जो यह देता है कि धारा एक त्रुटि में चल रही है या नहीं। जैसे कि यह eof() के लिए कॉल से अधिक चेक बना रहा है।

+0

चार्ल्स सही है, आप भी प्रेषक द्वारा प्रदान किए गए ऑपरेटर के साथ भ्रमित कर रहे हैं। –

+0

मैंने एक परीक्षण लिखा था, जबकि मेरे आखिरी पोस्ट हटा दिया। अब मुझे यकीन है कि यह बूल के लिए रहता है। –

+0

जब तक आपका एसएल कार्यान्वयन गैर मानक न हो, तब तक यह शून्य * हो जाता है। मानक की आवश्यकता है। –

8

अपडेट किया गया:

मैं गलती से basic_istream :: संतरी वर्ग पर ऑपरेटर bool() विधि के लिए basic_istream documentation की ओर इशारा किया था, लेकिन के रूप में बताया गया है यह वास्तव में क्या हो रहा है नहीं है। मैंने चार्ल्स और ल्यूक के सही उत्तरों को वोट दिया है। यह वास्तव में ऑपरेटर शून्य *() है जिसे बुलाया जा रहा है। इस in the C++ FAQ पर और अधिक।

+0

आप basic_ios साथ संतरी :: ऑपरेटर शून्य *() को भ्रमित कर रहे हैं के बजाय इस्तेमाल किया जा सकता -> http://dinkumware.com/ मैनुअल/default.aspx? मैनुअल = पूर्ण और पेज = ios.html # basic_ios :: ऑपरेटर% 20void% 20 * –

+0

अच्छा बिंदु। मैं भी सही खड़ा हूँ। – tgamblin

+1

आपका लिंक मृत है – qdii

-3

मैं पहले फॉर्म के साथ रहूंगा। जबकि दूसरा फॉर्म काम कर सकता है, यह शायद ही स्पष्ट है। आपका मूल कोड स्पष्ट रूप से वर्णन करता है कि क्या किया जा रहा है और यह कैसे व्यवहार करने की उम्मीद है।

+0

स्ट्रीम खराब हो सकती है और नहीं(), हालांकि। यदि आप स्पष्ट होना चाहते हैं, तो आप अच्छे() को कॉल कर सकते हैं। – tgamblin

+0

हाँ, आप सही हैं। पहले फॉर्म का उपयोग करना सबसे अच्छा होगा, लेकिन .eof() –

+2

की बजाय .good() पर कॉल के साथ व्यक्तिगत रूप से मुझे बूल के लिए निहित कास्ट का उपयोग पसंद है। ऐसा लगता है कि लाइनों पर फिर से चलने वाली सभी अन्य भाषाओं की तरह दिखता है। वास्तव में –

5

चार्ल्स ने correct answer दिया था।

क्या कहा जाता है जो तथ्य यह है कि std::getline() रिटर्न एक std::basic_istream (इस प्रकार, एक std::basic_ios) के साथ लगातार है, और नहीं एक संतरी वास्तव में std::basic_ios::operator void*(), और नहीं sentry::operator bool() है।

गैर विश्वासियों के लिए देखें:

अन्यथा, जैसा कि पहले से ही कहा गया है, दूसरे फॉर्म को पसंद करें एच कैनोलिक है। fail() यदि वास्तव में आप एक वर्बोज़ कोड नहीं चाहते का उपयोग करें - मैं कभी नहीं याद है कि क्या xxx.good()!xxx.fail()

+0

। डंकमवेयर ने अपना ऑनलाइन दस्तावेज हटा दिया है। लिंक तय धन्यवाद। –

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