c++ - How do I alter this tokenization process to work on a text file with multiple lines? -


मैं यह स्रोत कोड काम कर रहा हूं:

  #include & lt; string & gt; # शामिल करें & lt; vector & gt; # शामिल करें & lt; iostream & gt; # शामिल करें & lt; आईस्ट्रीम & gt; # शामिल करें & lt; ostream & gt; # शामिल करें & lt; इटरेटर & gt; # शामिल करें & lt; sstream & gt; # शामिल करें & lt; एल्गोरिथम & gt; Int main () {std :: string str = "त्वरित ब्राउन लोमड़ी"; // स्ट्रिंग std :: stringstream strstr (str) से एक स्ट्रीम का निर्माण; / / स्ट्रीम व्हाटेटर को स्ट्रीम को वेक्टर को कॉपी करने के लिए व्हाटस्पेस से अलग स्ट्रिंग्स std :: istream_iterator & lt; std :: string & gt; यह (strstr); std :: istream_iterator & LT; std :: स्ट्रिंग & gt; समाप्त; std :: वेक्टर & LT; std :: स्ट्रिंग & gt; परिणाम (यह, अंत); // वेक्टर को stdout पर भेजें std :: ostream_iterator & LT; std :: स्ट्रिंग & gt; OIT (std :: अदालत); Std :: copy (results.begin (), results.end (), ओट); }  

करने के लिए, एक पंक्ति को टोकाने के लिए और इसे सदिश परिणामों में डाल देने के बजाय, यह इस पाठ फ़ाइल से ली गई एक समूह लाइन को टोकन देता है और परिणामी शब्दों को एक सदिश में डालता है।

  टेक्स्ट फ़ाइल: मुनरो कहता है कि नाम का कोई विशेष अर्थ नहीं है और यह केवल एक ध्वन्यात्मक उच्चारण के बिना एक चार-अक्षर शब्द है, जो कुछ वह "एक क़ीमती और सावधानीपूर्वक सुरक्षित बिंदु के रूप में वर्णन करता है चार-वर्ण स्ट्रिंग्स का स्थान। " कॉमिक्स के विषय स्वयं बदलते हैं। कुछ जीवन और प्रेम पर बयान हैं (कुछ प्रेम स्ट्रिप्स केवल कविता के साथ कला हैं), और कुछ गणितीय या वैज्ञानिक-चुटकुले हैं अब तक, मैं केवल स्पष्ट है कि मुझे  
  का उपयोग करने की आवश्यकता है, जबकि (getline (streamOfText, readTextLine)) {}   

लेकिन मुझे नहीं लगता कि यह काम करेगा:

जबकि (getline (streamOfText, readTextLine)) {cout & lt; & LT; ReadTextLine & lt; & lt; Endl;

// स्ट्रिंग std :: stringstream strstr (readTextLine) से एक स्ट्रीम का निर्माण;

// व्हाट्सएस से अलग तार स्ट्रिंग के रूप में स्ट्रीम को स्ट्रीम की प्रतिलिपि बनाने के लिए स्ट्रीम iterators का उपयोग करें :: istream_iterator यह (strstr); Std :: istream_iterator अंत; Std :: vector परिणाम (यह, अंत);

  / * हो सकता है क्या मैं इस तरह के इतोक्टरों और वेक्टर के लिए कंसल्टेंट्स का पुनः निर्णायक और उपयोग के बिना लूप को बना सकता हूं? * / // सदिश को stdout पर भेजें। std :: ostream_iterator & LT; std :: स्ट्रिंग & gt; OIT (std :: अदालत); Std :: copy (results.begin (), results.end (), ओट); }  

हां, तो आपके पास readTextLine । क्या यह है कि आप उस लूप में क्या चाहते थे? फिर सदिश को इस्ट्रीम थियेटर से बनाने के बजाय वेक्टर में कॉपी करें, और लूप के बाहर वेक्टर को परिभाषित करें:

  std :: vector & lt; std :: string & gt; परिणाम; जबकि (getline (streamOfText, readTextLine)) {std :: istringstream strstr (readTextLine); std :: istream_iterator & LT; std :: स्ट्रिंग & gt; यह (strstr), अंत; Std :: copy (यह, अंत, std :: back_inserter (परिणाम)); }  

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

  std :: istream_iterator & lt; std :: string & gt; यह (स्ट्रीम ऑफ टेक्स्ट), अंत; std :: वेक्टर & LT; std :: स्ट्रिंग & gt; परिणाम (यह, अंत);  

मैन्युअल रूप से सभी करने के लिए, जैसे कि आप टिप्पणियों में पूछते हैं,

  std :: istream_iterator & lt; std :: string & gt; यह (स्ट्रीम ऑफ टेक्स्ट), अंत; जबकि (यह! = अंत) results.push_back (* यह ++);  

मैं आपको इस पर एक अच्छी किताब पढ़ने की सलाह देता हूं। यह आपको अधिक उपयोगी तकनीक दिखाएगा जो मुझे लगता है। Josuttis द्वारा एक अच्छी किताब है।


Comments