2011-02-02 11 views
21

हर बार जब मैं सी ++ कोड लाइन की एक त्वरित टुकड़ादो अलग-अलग गेटलाइन() फ़ंक्शन क्यों हैं (यदि वास्तव में हैं)?

std::string s; 
cin >> s; 

मैं अपने आप को शाप क्योंकि मैं भूल गया यह एक पूरी लाइन हो रही के बजाय खाली स्थान के पर बंद हो जाता है।

फिर, getline याद पर, मैं हमेशा उलझन में दो किस्मों के रूप में बन:

std::string s; 
getline (std::cin, s); 

और:

char cs[256]; 
std::cin.getline (cs, sizeof (cs)); 

वहाँ वास्तव में इन दोनों के डेटा प्रकार के अलावा अन्य के बीच एक अंतर है?

ऐसा लगता है कि सी ++ तरीका पूर्व होना चाहिए। मैं किस परिस्थितियों में बाद के लोगों का उपयोग करूंगा, बशर्ते कि मुझे संभवत: नल-टर्मिनेटेड वर्ण सरणी के वास्तविक तारों का उपयोग करना चाहिए?

और, क्योंकि इनपुट वास्तव में इनपुट स्ट्रीम का दायरा होना चाहिए, istream का पूर्व भाग क्यों नहीं है?

उत्तर

8

ध्यान रखें कि मानक पुस्तकालय 3 (मुख्य) भागों से बना है: आईओएसट्रीम, स्ट्रिंग और एसटीएल, साथ ही कुछ उपहारों और सी-हेडर में फंस गए हैं।

मुझे उन हिस्सों को कम से कम युग्मित करने में अजीब कुछ नहीं दिख रहा है (हालांकि मेरी इच्छा है कि यह मामला न हो)।

अन्य incongruities में शामिल हैं: std::string::length बनाम std::string::size, बाद एसटीएल और पूर्व के साथ इंटरफेस संगतता के लिए जोड़ा गया है पुराने कोड के साथ संगतता के लिए बनाए रखा गया है।

+3

मुझे लगता है कि वाक्यांश "कमजोर युग्मित" है, "खराब एकीकृत" नकारात्मक अर्थ है। मुझे लगता है कि यह एक अच्छी बात है (टीएम) कि आप 'std :: istream' की आवश्यकता के बिना' std :: string' का उपयोग कर सकते हैं और 'std :: string' की आवश्यकता के बिना' std :: istream' का उपयोग कर सकते हैं। –

+2

@ चार्ल्स: क्या आप मुझ पर विश्वास करेंगे अगर मैंने आपको बताया कि मैंने "सबमिट" मारने से पहले बिल्कुल विपरीत बदलाव किया है :)? मैं व्यक्तिगत रूप से एक और "वर्दी" मानक पुस्तकालय का पक्ष लेता हूं। सी ++ मानक पुस्तकालय "जैविक विकास" का प्रतीक है। –

+2

@ चार्ल्स: मुझे निश्चित रूप से लगता है कि यह गलत है कि iostreams और स्ट्रिंग युग्मित नहीं हैं। मेरा मतलब है, iostream एक बुनियादी स्तर पर तारों में हेरफेर करने पर निर्भर करता है। निर्भरता को कम करना एक बात है, यदि आप स्ट्रिंग क्लास नहीं हैं तो सी-स्ट्रिंग के साथ काम करने वाले सदस्य फ़ंक्शन उपलब्ध नहीं हैं। – Puppy

1

getline iostreams लाइब्रेरी के अंदर संस्करण स्ट्रिंग्स को लक्ष्य के रूप में समर्थन नहीं करता है, इसलिए स्ट्रिंग लाइब्रेरी ने एक संस्करण परिभाषित किया है।

22

वैश्विक getline() फ़ंक्शन सी ++ std::string ऑब्जेक्ट्स के साथ काम करता है।

istream::getline() विधियां "क्लासिक" सी स्ट्रिंग्स (पॉइंटर्स char) के साथ काम करती हैं।

+0

तो, अगर यह केवल एक चीज है जो स्ट्रिंग्स है, तो यह मेरी प्यारी 'object.method() 'दुनिया के दृश्य को तोड़ने के बजाय' s.getline (std :: cin) क्यों नहीं है? – paxdiablo

+3

@paxdiablo, यह अर्थशास्त्र का सवाल हो सकता है: 'getline()' एक स्ट्रीम ऑपरेशन है, स्ट्रिंग ऑपरेशन नहीं, इसलिए इसे 'std :: string' वर्ग का तरीका बनाना अजीब होगा। –

+4

मेरा अनुमान है के बारे में पता नहीं है, इसलिए std :: cin में std :: string को वापस करने वाली विधि नहीं हो सकती है। – Grozz

1

हाँ आधुनिक सी ++ तरीका मुफ्त फ़ंक्शन का उपयोग करना और std :: string इनपुट करना है।

लेकिन आईओएसट्रीम में std :: स्ट्रिंग की तुलना में अब तक का लंबा इतिहास (मानक संस्करण कम से कम एक ही डिजाइन का तीसरा अवतार है) और इतिहास बताता है कि चीजें किस तरह से हैं।

(गेटलाइन सदस्य का लाभ यह है कि यह गतिशील आवंटन को इंगित नहीं करता है, यह विशेषता समय पर आसान हो सकती है लेकिन शायद इसे स्क्रैच डिज़ाइन से उचित ठहराने के लिए पर्याप्त नहीं होगी)।

6

यह एक आम इंटरफ़ेस-डिज़ाइन समस्या है। cin.getline() अनुरोध करने का एक स्वाभाविक तरीका है, लेकिन स्ट्रीम कोड को <string> पर निर्भर करने से बचने के लिए, cin.getline(std::string&) फ़ंक्शन की पेशकश की जा सकती है। स्ट्रिंग्स को दायरे में लाए जाने के बाद फ्री-स्टैंडिंग getline(cin, s) बाद में जोड़ा जा सकता है। char* के लिए कोई समस्या नहीं है क्योंकि #include पर कुछ भी नहीं है - वैसे भी भाषा का सभी हिस्सा।

कुछ मायनों में, यह तब अच्छा होता है जब भाषाएं बाद के कोड को मौजूदा कक्षाओं (जैसे रूबी) में आगे के कार्यों को जोड़ने की अनुमति देती हैं, लेकिन अन्य तरीकों से डॉकोकलाइज़ेशन काटने और अच्छी तरह से, रखरखाव समझौता करता है। फिर निश्चित रूप से कम से कम सदस्य कार्यों और बहुत से नि: शुल्क कार्यों के लिए लोकप्रिय तर्क है: मैं व्यक्तिगत रूप से सोचता हूं कि इसे अब तक नहीं लिया जाना चाहिए ताकि इंटरफ़ेस को कम सहज और अभिव्यक्तिपूर्ण बनाया जा सके, लेकिन प्रत्येक को स्वयं ही।

+0

ऐसा एकमात्र उत्तर लगता है जो स्पष्ट रूप से बताता है कि यह decoupling डिजाइन द्वारा क्यों है। केवल तथ्य यह है कि 'स्ट्रिंग'' iostream' से नया है, आखिरकार, अपने आप में पर्याप्त स्पष्टीकरण नहीं है कि उत्तरार्द्ध को फिर से क्यों नहीं हटाया गया था। मुझे लगता है कि एक ऐसा समय था जहां निर्णय कम विवादास्पद था, और अप्रयुक्त 'स्ट्रिंग' वर्ग रखने का उपर अपेक्षाकृत बड़ा था। –

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