[C con Clase] getline()
Steven Davidson
srd4121 en njit.edu
Jue Jun 19 22:47:23 CEST 2008
Hola Juan
Juan wrote:
> Estuve buscando con stringstream, pero no encontré ningún ejemplo,
> aunque en realidad no necesitaba sacar lineas, sino hacer bloques de
> x lineas, así que lo solucioné simplemente comparando caracter por
> caracter con '\n' y poniendo cada bloque en un vector de string, sin
> eliminar los saltos de linea. De todas maneras era esto lo que
> buscaba. Muchas gracias.
Para la búsqueda, podrías haber usado la función estándar 'strchr()'.
Por ejemplo,
char szCad[1024];
...
size_t pos = strchr( szCad, '\n' );
Luego puedes usar 'strncpy()' para copiar hasta n caracteres. Aunque
quizá sería mejor usar 'memcpy()', ya que hace la copia, sin consultar
los caracteres copiados.
La otra solución es usar 'strtok()', la cual "trocea" la cadena
sustituyendo los caracteres '\n' por nulos. Cada vez que obtengas una
cadena, copia su dirección de memoria a tu lista de cadenas. Por ejemplo,
char *lista[32];
lista[0] = strtok( szCad, "\n" );
lista[1] = strtok( NULL, "\n" );
lista[2] = strtok( NULL, "\n" );
lista[3] = strtok( NULL, "\n" );
...
Obviamente, aconsejo usar un bucle para implementar esta lógica.
Si quieres una solución que tiende más hacia C++, entonces puedes usar
'getline()' de la clase 'stringstream'. Si quieres meter todo en un
objeto 'string', entonces puedes usar sus propias funciones como
'find_first_of()' y 'substr()' para conseguir una subcadena. Por ejemplo,
vector< string > lista;
string str( szCad );
string::size_type n=0;
n += 1 + str.find_first_of( '\n', n );
if( string::npos != n )
lista.push_back( str.substr( n ) );
Nuevamente, necesitas un bucle para el resto de las subcadenas.
Espero que esto te sirva.
Steven
Más información sobre la lista de distribución Cconclase