दिलचस्प पोस्ट
जावा: एक पाठ फ़ाइल कैसे पढ़ा जाए MySQL – मौजूदा तालिका में प्रत्येक शब्द का पहला अक्षर कैपिटल बनाना त्रुटि: पैकेज 'com.google.example' main.xml में विशेषता 'adSize' के लिए कोई संसाधन पहचानकर्ता नहीं मिला JQuery: डुप्लिकेट तत्व निकालें? फ़ाइल का अंत सी ++ में xmlHttp.getResponseHeader + CORS के लिए काम नहीं कर रहा है एक जावास्क्रिप्ट एआरआर बनाएँ जिसमें 1 … एन PHP में स्ट्रिंग के रूप में दिए गए फार्मूला का मूल्यांकन कैसे करें? क्या कोई साइट ब्राउज़र एक्सटेंशन खोल सकता है? Android डिवाइस पर स्थानीय होस्ट कैसे ब्राउज़ करें? मानचित्र फ़ंक्शन को समझना Android.os.DeadObjectException एंड्रॉइड एक्स कैसे ठीक करें मान के लिए दस्तावेज कहाँ है () Enum की विधि? Laravel 5 आवश्यक बूटस्ट्रैप खोलने में विफल … / विक्रेता / autoload.php Socket.IO 1.x और Express 4.x के साथ सत्र कैसे साझा करें?

C ++ में लाइन से मैं cin लाइन पर कैसे पुनरावृत्त करूं?

मैं std::cin लाइन से लाइन करना चाहता हूं, प्रत्येक पंक्ति को std::string रूप में संबोधित करना चाहता हूं। कौनसा अच्छा है:

 string line; while (getline(cin, line)) { // process line } 

या

 for (string line; getline(cin, line); ) { // process line } 

? ऐसा करने का सामान्य तरीका क्या है?

वेब के समाधान से एकत्रित समाधान "C ++ में लाइन से मैं cin लाइन पर कैसे पुनरावृत्त करूं?"

चूंकि चाचा ने अपने LineInputIterator को ऊपर लाया, मुझे लगा कि मैं कुछ और वैकल्पिक तरीकों को जोड़ूंगा। सबसे पहले, एक बहुत ही सरल वर्ग जो एक स्ट्रिंग प्रॉक्सी के रूप में कार्य करता है:

 class line { std::string data; public: friend std::istream &operator>>(std::istream &is, line &l) { std::getline(is, l.data); return is; } operator std::string() const { return data; } }; 

इसके साथ, आप अभी भी एक सामान्य इस्ट्रीम_आईटरेटर का उपयोग करते हुए पढ़ते हैं। उदाहरण के लिए, किसी स्ट्रिंग के सदिश में किसी फ़ाइल में सभी पंक्तियों को पढ़ने के लिए, आप ऐसा कुछ इस्तेमाल कर सकते हैं:

 std::vector<std::string> lines; std::copy(std::istream_iterator<line>(std::cin), std::istream_iterator<line>(), std::back_inserter(lines)); 

महत्वपूर्ण बात यह है कि जब आप कुछ पढ़ रहे हैं, तो आप एक पंक्ति निर्दिष्ट करते हैं – परन्तु अन्यथा, आपके पास सिर्फ तार हैं

एक और संभावना मानक पुस्तकालय के एक भाग का उपयोग करती है जो अधिकांश लोगों को मुश्किल से भी पता होता है, बहुत वास्तविक उपयोग होने का उल्लेख नहीं करना है। जब आप ऑपरेटर >> का उपयोग करते हुए एक स्ट्रिंग पढ़ते हैं, तो स्ट्रीम उस स्ट्रिंग की एक स्ट्रिंग देता है जो कि स्ट्रीम की लोकेल कहती है कि यह एक सफेद स्पेस वर्ण है। विशेषकर यदि आप बहुत सारे काम कर रहे हैं जो सभी रेखा-उन्मुख है, तो सीटीईपी पहलू के साथ एक स्थान बनाने के लिए सुविधाजनक हो सकता है जो कि नई लाइन को सफेद-स्थान के रूप में वर्गीकृत करता है:

 struct line_reader: std::ctype<char> { line_reader(): std::ctype<char>(get_table()) {} static std::ctype_base::mask const* get_table() { static std::vector<std::ctype_base::mask> rc(table_size, std::ctype_base::mask()); rc['\n'] = std::ctype_base::space; return &rc[0]; } }; 

इसका उपयोग करने के लिए, आप उस पहलू को इस्तेमाल करते हुए एक स्थान के साथ पढ़ना चाहते हैं, तो बस सामान्य रूप से स्ट्रिंग पढ़िए, और ऑपरेटर >> स्ट्रिंग के लिए हमेशा एक पूरी लाइन पढ़ता है उदाहरण के लिए, यदि हम लाइनों में पढ़ना चाहते हैं, और सॉर्ट क्रम में अद्वितीय लाइनों को लिखना चाहते हैं, तो हम इस तरह से कोड का उपयोग कर सकते हैं:

 int main() { std::set<std::string> lines; // Tell the stream to use our facet, so only '\n' is treated as a space. std::cin.imbue(std::locale(std::locale(), new line_reader())); std::copy(std::istream_iterator<std::string>(std::cin), std::istream_iterator<std::string>(), std::inserter(lines, lines.end())); std::copy(lines.begin(), lines.end(), std::ostream_iterator<std::string>(std::cout, "\n")); return 0; } 

ध्यान रखें कि यह स्ट्रीम से सभी इनपुट को प्रभावित करता है अन्य इनपुट के साथ रेखा-उन्मुख इनपुट को मिश्रण करने से बहुत अधिक नियमों का उपयोग करना (जैसे स्ट्रीम का उपयोग करते हुए stream>>my_integer से एक संख्या पढ़ना stream>>my_integer सामान्य रूप से असफल हो जायेगा)।

मेरे पास (एक अभ्यास के रूप में लिखा गया है, लेकिन शायद उपयोगी दिन निकल जाता है), LineInputIterator है:

 #ifndef UB_LINEINPUT_ITERATOR_H #define UB_LINEINPUT_ITERATOR_H #include <iterator> #include <istream> #include <string> #include <cassert> namespace ub { template <class StringT = std::string> class LineInputIterator : public std::iterator<std::input_iterator_tag, StringT, std::ptrdiff_t, const StringT*, const StringT&> { public: typedef typename StringT::value_type char_type; typedef typename StringT::traits_type traits_type; typedef std::basic_istream<char_type, traits_type> istream_type; LineInputIterator(): is(0) {} LineInputIterator(istream_type& is): is(&is) {} const StringT& operator*() const { return value; } const StringT* operator->() const { return &value; } LineInputIterator<StringT>& operator++() { assert(is != NULL); if (is && !getline(*is, value)) { is = NULL; } return *this; } LineInputIterator<StringT> operator++(int) { LineInputIterator<StringT> prev(*this); ++*this; return prev; } bool operator!=(const LineInputIterator<StringT>& other) const { return is != other.is; } bool operator==(const LineInputIterator<StringT>& other) const { return !(*this != other); } private: istream_type* is; StringT value; }; } // end ub #endif 

तो आपका लूप एक एल्गोरिदम (सी ++ में एक अन्य अभ्यासित अभ्यास) से बदला जा सकता है:

 for_each(LineInputIterator<>(cin), LineInputIterator<>(), do_stuff); 

शायद एक सामान्य कार्य एक कंटेनर में हर पंक्ति को संग्रहित करना है:

 vector<string> lines((LineInputIterator<>(stream)), LineInputIterator<>()); 

पहले वाला।

दोनों एक ही करते हैं, लेकिन पहले एक बहुत अधिक पठनीय है, प्लस आप पाश के बाद स्ट्रिंग चर रखने के लिए मिलते हैं (2 विकल्प में, इसके लूप क्षेत्र में संलग्न है)

जबकि कथन के साथ जाओ

स्टीव मैककॉन्एल द्वारा कोड पूर्ण 2 के अध्याय 16.2 देखें (विशेषकर पृष्ठ 374 और 375)

उद्धरण के लिए:

लूप का उपयोग न करें जब एक लूप अधिक उचित हो। सी ++, सी # और जावा में लूप के लिए लचीला के एक सामान्य दुरुपयोग, लूप के लिए एक समय की लूप की सामग्री बेतरतीब ढंग से cramming है।

सी ++ एक देर लूप का उदाहरण अपमानजनक रूप से लूप हेडर के लिए सीममेड

 for (inputFile.MoveToStart(), recordCount = 0; !inputFile.EndOfFile(); recordCount++) { inputFile.GetRecord(); } 

सी + + थोड़ी देर लूप के उचित उपयोग का उदाहरण

 inputFile.MoveToStart(); recordCount = 0; while (!InputFile.EndOfFile()) { inputFile.getRecord(); recordCount++; } 

मैंने कुछ हिस्सों को बीच में छोड़ दिया है लेकिन उम्मीद है कि आपको एक अच्छा विचार मिलेगा।