@Steve Townsend ha già indicato una possibilità. Se preferisci usare operator>>
invece di std::getline
, puoi farlo anche tu. Uno istream
considera sempre gli spazi come separatore. Ogni stream ha una locale associata e ogni locale include una faccetta ctype
. Il facet ctype
è ciò che lo istream
utilizza per determinare quali caratteri di input sono spazi bianchi.
Nel tuo caso, apparentemente vuoi che lo stream tratti solo le nuove righe e i due punti come "spazi bianchi" (cioè separatori), mentre il carattere dello spazio effettivo viene semplicemente considerato come un carattere "normale", non un separatore.
Per fare questo, è possibile creare un aspetto ctype come questo:
struct field_reader: std::ctype<char> {
field_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;
rc[':'] = std::ctype_base::space;
return &rc[0];
}
};
da usare, questo, è necessario "infondere" il flusso con una localizzazione utilizzando questo aspetto:
int main() {
std::stringstream input("A:KT5:14:executive desk:");
// have the stream use our ctype facet:
input.imbue(std::locale(std::locale(), new field_reader()));
// copy fields from the stream to standard output, one per line:
std::copy(std::istream_iterator<std::string>(input),
std::istream_iterator<std::string>(),
std::ostream_iterator<std::string>(std::cout, "\n"));
return 0;
}
Sono il primo ad ammettere, tuttavia, che questo ha alcune carenze. Prima di tutto, local e facet sono in genere piuttosto scarsamente documentati, quindi più è probabile che i programmatori C++ lo trovino abbastanza difficile da comprendere (specialmente quando tutto il vero lavoro avviene "sotto le copertine", per così dire).
Un'altra possibilità è utilizzare Boost Tokenizer. In tutta onestà, questo è un po 'altro lavoro da usare - richiederà che tu faccia qualcosa come leggere una stringa, quindi suddividerla separatamente.Allo stesso tempo, è ben documentato, ampiamente conosciuto, e si adatta abbastanza bene ai preconcetti della gente su come fare cose del genere, che molte persone probabilmente troveranno più facile seguire nonostante la complessità extra.
Wow ... e non in senso positivo. Penso che starò con C. – onemasse
grazie Steve !!! – rajh2504
@onemasse, erm: la dichiarazione in realtà assomiglia a: 'istream & getline (istream & is, string & str, char delim);', non così male ora è? :), per non parlare di ciò che 'std :: getline' ti dà sull'equivalente C! :) – Nim