@Steve Townsend ya ha señalado una posibilidad. Si prefiere usar operator>>
en lugar de std::getline
, puede hacerlo también. Un istream
siempre trata el espacio en blanco como un separador. Cada secuencia tiene una configuración regional asociada, y cada configuración regional incluye una faceta ctype
. Esa faceta ctype
es lo que usa el istream
para determinar qué caracteres de entrada son espacios en blanco.
En su caso, aparentemente desea que la secuencia trate únicamente líneas nuevas y dos puntos como "espacios en blanco" (es decir, separadores), mientras que el espacio real solo se trata como un carácter "normal", no como separador.
Para hacer eso, usted puede crear una faceta ctype así:
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];
}
};
Para utilizar, esto, hay que "impregnar" la corriente con una configuración regional utilizando esta faceta:
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;
}
Soy el primero en admitir, sin embargo, que esto tiene algunas deficiencias. En primer lugar, las configuraciones regionales y las facetas generalmente están bastante poco documentadas, por lo que la mayoría de los programadores C++ de es probable que encuentren esto bastante difícil de entender (especialmente cuando todo el trabajo real ocurre "oculto", por así decirlo).
Otra posibilidad es usar Boost Tokenizer. Con toda honestidad, esto es un poco más trabajo para usar; requerirá que hagas algo así como leer una cadena y luego dividirla por separado.Al mismo tiempo, está bien documentado, es bastante conocido y se ajusta bastante mejor a las ideas preconcebidas de las personas sobre cómo hacer esas cosas, y es probable que a algunas personas les resulte más fácil seguirlo a pesar de la complejidad adicional.
Wow ... y no en el buen sentido. Creo que me quedaré con C. – onemasse
gracias Steve !!! – rajh2504
@onemasse, erm: la declaración en realidad se ve así: 'istream & getline (istream & is, string & str, char delim);', no tan malo ahora, ¿verdad? :), sin mencionar lo que 'std :: getline' te da sobre el equivalente C! :) – Nim