[C con Clase] Duda sobre cin.getline

Steven Davidson srd4121 en njit.edu
Lun Abr 4 23:23:46 CEST 2011


Hola Jovanny,

On 4/4/2011 1:28 PM, Jovanny wrote:
> Hola Steven,
>
> Como podría usar esas ¿funciones? y aplicarlas a mi programa para
> arreglar mi problema; la verdad es que casi no le entiendo a esas
> funciones que pusiste arriba, agradecería me explicaras.

Puedes consultar el apéndice E del curso de C++ acerca de las 
clases-plantillas estándares de los canales. El enlace que te interesa 
para estas funciones miembro es el siguiente: 
http://c.conclase.net/curso/index.php?cap=904c#APD_istream  Para 
'in_avail()', consulta el siguiente enlace: 
http://c.conclase.net/curso/index.php?cap=904b#APD_streambuf

Brevemente, diré que 'ignore()' es para descartar una cantidad indicada 
de caracteres o hasta encontrar un carácter separador indicado; por 
defecto, la cantidad es 1 y el separador es fin-de-fichero (EOF).

La función miembro 'in_avail()' sirve para determinar cuántos caracteres 
quedan almacenados en el búfer del canal.

La idea es que consigas la cantidad de caracteres disponibles en el 
canal para usarla en la función miembro, 'ignore()', para descartar esa 
cantidad de caracteres en el canal. Esto es,

cin.ignore( cin.rdbuf->in_avail() );


Otra solución es simplemente leer todos los caracteres en una cadena 
temporal, la cual no se usará para otra cosa; por ejemplo,

int num;
char szCadena[10];
char szTemp[10240];  // 10 KB

cin >> num;
cin.getline( szTemp );
cin.getline( szCadena );


Una solución parecida, pero posiblemente segura, es ir carácter a 
carácter comprobando cada extracción para tomar mejores decisiones.


También puedes indicar en la extracción que se salte los espacios 
blancos con el manipulador, 'skipws', definido en <ios>. Por ejemplo,

cin >> skipws >> num >> szCadena;


Espero haber aclarado un poco más el tema.

Steven





Más información sobre la lista de distribución Cconclase