[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