2012-10-15 33 views
5

istream::getline(string, 256, '\n' OR ';') के प्रभाव प्राप्त करने का सबसे साफ तरीका क्या है?आईट्रीम :: getline() की तरह कुछ लेकिन वैकल्पिक डेलीम पात्रों के साथ?

मुझे पता है कि यह एक लूप लिखने के लिए काफी सरल है, लेकिन मुझे लगता है कि मुझे कुछ याद आ रहा है। क्या मैं हूँ

मैं क्या इस्तेमाल किया:

while ((is.peek() != '\n') && (is.peek() != ';')) 
    stringstream.put(is.get()); 

उत्तर

3

दुर्भाग्यवश कई "लाइन एंडिंग" रखने का कोई तरीका नहीं है। आप क्या कर सकते हैं उदाहरण के साथ लाइन पढ़ा है std::getline और इसे std::istringstream में डालें और पर एक लूप में std::getline (';' विभाजक के साथ) का उपयोग करें।

हालांकि आप इसे देखने के लिए Boost iostreams लाइब्रेरी देख सकते हैं, इसके लिए इसकी कार्यक्षमता है।

enum class cascade { yes, no }; 
std::istream& getline(std::istream& stream, std::string& line, const std::string& delim, cascade c = cascade::yes){ 
    line.clear(); 
    std::string::value_type ch; 
    bool stream_altered = false; 
    while(stream.get(ch) && (stream_altered = true)){ 
     if(delim.find(ch) == std::string::npos) 
      line += ch; 
     else if(c == cascade::yes && line.empty()) 
      continue; 
     else break; 
    } 
    if(stream.eof() && stream_altered) stream.clear(std::ios_base::eofbit); 
    return stream; 
} 

cascade::yes विकल्प पाया लगातार परिसीमकों गिर:

+0

ठीक है, धन्यवाद, यह काफी अच्छा है! मैंने एक लूप लिखा है जो std :: stringstream.put(): प्रत्येक char को तब तक संपादित करें जब तक यह '\ n' या ';' नहीं मिलता है, और फिर स्ट्रिंग प्राप्त करने के लिए stringstream.str() का उपयोग किया जाता है। – Erika

3

वहाँ std::getline है। अधिक जटिल परिदृश्यों के लिए istream_iterator या istreambuf_iteratorboost split या regex_iterator (here is an example स्ट्रीम इटरेटर्स का उपयोग करने के साथ) को विभाजित करने का प्रयास कर सकता है।

+2

'std :: getline' अच्छा है, क्योंकि यह' एसटीडी के लिए एक अधिभार है: : स्ट्रिंग' जो स्ट्रिंग I/O को बहुत आसान बनाता है (कम से कम मेरी राय में)। – dreamlax

+2

'std :: getline' इस मामले में मदद नहीं करता है जब ओपी एकाधिक लाइन समाप्ति/विभाजक चाहता है। –

0

यहाँ एक काम कर रहा कार्यान्वयन है। cascade::no के साथ, यह लगातार दूसरे डिलीमीटर के लिए एक खाली स्ट्रिंग वापस कर देगा।

उपयोग:

const std::string punctuation = ",.';:?"; 
std::string words; 
while(getline(istream_object, words, punctuation)) 
    std::cout << word << std::endl; 

इसके उपयोग Live on Coliru

देखें एक और अधिक जेनेरिक वर्जन होगा this

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

  • कोई संबंधित समस्या नहीं^_^