[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