2010-11-16 18 views
17

मेरे पास एक std :: स्ट्रिंग ऑब्जेक्ट में एक टेक्स्ट है। पाठ में कई रेखाएं हैं। मैं एसटीएल (या बूस्ट) का उपयोग कर लाइन लाइन से टेक्स्ट लाइन पर फिर से शुरू करना चाहता हूं। मेरे साथ आने वाले सभी समाधान सुरुचिपूर्ण से बहुत दूर लगते हैं। मेरा सबसे अच्छा तरीका लाइन ब्रेक पर पाठ को विभाजित करना है। क्या कोई और सुरुचिपूर्ण समाधान है?सी ++: एसटीएल के साथ लाइन द्वारा std :: स्ट्रिंग लाइन में किसी टेक्स्ट पर पुनरावृत्ति कैसे करें?

अद्यतन: यह मैं क्या देख रहा था है:

std::string input; 
// get input ... 
std::istringstream stream(input); 
std::string line; 
while (std::getline(stream, line)) { 
    std::cout << line << std::endl; 
} 

मैंने सोचा कि मैं पहले से ही यह कोशिश की। मुझे एक कंपाइलर त्रुटि मिली और इसे दूर फेंक दिया। जल्दी करने के लिए!

+0

क्या आप "अधिक सुरुचिपूर्ण" जैसे सी # के foreach "foreach (लाइनों में स्ट्रिंग लाइन)" की तलाश में हैं? आपने वास्तव में क्या प्रयास किया है। यदि आप गतिशील या उच्च स्तर की भाषाओं में उपयोग करते हैं, तो सी ++ 'सुरुचिपूर्ण' महसूस कर सकता है, लेकिन सी ++ "सुरुचिपूर्ण" में आपको कभी सौंपा नहीं जाता है, आपको आमतौर पर खुद को लालित्य कार्यक्रम करना होता है। – Crisfole

+1

यह * सटीक डुप्लिकेट नहीं हो सकता है, लेकिन आप यह भी देखना चाहेंगे: http://stackoverflow.com/questions/1567082/how-do-i-iterate-over-cin-line-by-line -इन-सी –

+0

इसे अपडेट करने के बजाय अपने स्वयं के प्रश्न का उत्तर देना बेहतर होगा। अद्यतन भविष्य के पाठक के लिए भ्रमित हो सकता है ... – Wolf

उत्तर

17

आप टेक्स्ट को अपनी स्रोत फ़ाइल में क्यों रखते हैं? इसे एक अलग पाठ फ़ाइल में रखें। यह std :: ifstream साथ खोलें और वैकल्पिक रूप से while(getline(...))

#include <iostream> 
#include <fstream> 

int main() 
{ 
    std::ifstream fin("MyText.txt"); 
    std::string file_line; 
    while(std::getline(fin, file_line)) 
    { 
     //current line of text is in file_line, not including the \n 
    } 
} 

साथ इस पर पुनरावृति, पाठ एक समान तरीके से

में std::istringstream उपयोग करके अपने प्रश्न है, तो लाइन द्वारा एक std::string चर पढ़ने लाइन में होना चाहिए अगर कैसे का उपयोग कर + बिना अपने कोड में lexially पाठ डाल करने के लिए, कृपया ध्यान दें कि आसन्न स्ट्रिंग शाब्दिक संकलन से पहले concatenated रहे हैं, तो आप ऐसा कर सकते हैं:

std::string text = 
    "Line 1 contents\n" 
    "Line 2 contents\n" 
    "Line 3 contents\n"; 
+5

यदि आपको वास्तव में 'std :: string' के साथ काम करने की आवश्यकता है, तो आप इसे 'std :: stringstream' में लपेट सकते हैं और आर्मेन के समाधान को लागू कर सकते हैं। –

+0

यदि डेटा पहले से ही एक स्ट्रिंग है, तो आप उसी तरह से 'std :: stringstream' का उपयोग कर सकते हैं। –

+0

@ स्पेस: मैंने संपादित किया :) –

3

यदि आप line by line लूप करना चाहते हैं, जैसा कि आप कहते हैं, लाइन ब्रेक पर टेक्स्ट को विभाजित क्यों करना चाहते हैं, वही नहीं है जो आप चाहते हैं?

आपने यह कोड पोस्ट नहीं किया है कि आप यह कैसे कर रहे हैं, लेकिन आपका दृष्टिकोण जो आपने कहा था उसे पूरा करने के लिए सही लगता है। यह कम क्यों महसूस करता है?

+0

यह मेरे लिए भी सही दृष्टिकोण लगता है। – Simone

+0

मैं कुछ एसटीएल बिल्ड-इन समाधान का उपयोग करना चाहता हूं। AFAIK लाइन समाप्ति मंच-निर्भर हैं इसलिए यदि संभव हो तो मैं उस समाधान से बचना चाहता हूं। –

+0

@ फेयर: वह (आपके वर्तमान कोड के साथ) ऐसी जानकारी की तरह लगता है जो मूल प्रश्न में होना चाहिए था। यह एक वैध चिंता है और इसे संबोधित किया जा सकता है, लेकिन केवल अगर आप इसे संबोधित करते हैं तो :) – KevenK

8

उपयोग Boost.Tokenizer :

std::string text("foo\n\nbar\nbaz"); 

typedef boost::tokenizer<boost::char_separator<char> > line_tokenizer; 
line_tokenizer tok(text, boost::char_separator<char>("\n\r")); 

for (line_tokenizer::const_iterator i = tok.begin(), end = tok.end(); 
    i != end ; ++i) 
    std::cout << *i << std::endl; 

प्रिंट

foo 
bar 
baz 

ध्यान दें कि यह खाली लाइनों, जो या नहीं हो सकता है हो सकता है कि आप क्या चाहते से अधिक छोड़ देता है।

+0

किसी भी चीज़ के लिए बूस्ट :: टोकनेज़र का उपयोग नहीं कर रहा है जो कि गेटलाइन प्रकार के साथ किया जा सकता है जैसे कि एक नाक के साथ एक स्पैरो मारना? –

+0

ओपी क्या करना चाहता है इस पर निर्भर करता है। यह समाधान काफी छोटा है और यह इटेटरेटर्स की एक जोड़ी उत्पन्न करता है जिसे एसटीएल एल्गोरिदम को सौंप दिया जा सकता है। –

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