2012-10-15 16 views

risposta

3

Sfortunatamente non è possibile avere più "fine linea". Quello che puoi fare è leggere la riga con ad es. std::getline e inserirlo in un std::istringstream e utilizzare std::getline (con il separatore ';') in un ciclo su istringstream.

Anche se è possibile controllare la libreria Boost iostreams per vederlo, ha funzionalità per esso.

+0

Ok, grazie, è molto bello! Ho scritto un ciclo che std :: stringstream.put(): ed ogni char finché non ha trovato '\ n' o ';', e quindi ha usato stringstream.str() per ottenere la stringa. – Erika

3

C'è std::getline. Per scenari più complessi si potrebbe provare a suddividere lo istream_iterator o istreambuf_iterator con boost split o regex_iterator (here is an example dell'utilizzo di iteratori di streaming).

+2

'std :: getline' è buono perché ha un sovraccarico per' std: : string' che rende l'I/O delle stringhe molto, molto più semplice (almeno secondo me). – dreamlax

+2

'std :: getline' non è di aiuto in questo caso quando l'OP desidera più terminazioni/separatori di riga. –

0

Ecco un'implementazione funzionante:

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; 
} 

L'opzione cascade::yes collassa delimitatori consecutivi trovati. Con cascade::no, restituirà una stringa vuota per ciascun secondo delimitatore consecutivo trovato.

Usage:

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

vedere il suo utilizzo Live on Coliru

Una versione più generica sarà this