Título: PROBLEMA con la funcion miembro getline() e ignore() Publicado por: .:BlackCoder:. en 26 Julio 2010, 06:07 am Wenas... no se si es por el tiempo sin programar o wtf pero tengo problemas con getline() Lo explico en el codigo:
Código
Me imagino el error esta en getline()... La use pasandole como delimitador ':' y funciono pero igual me quedo la duda de porque no funciona... Gracias a quien pueda aclarar la duda... Saludos... Asi es como "funciona" bueno mas o menos porque el for da una vuelta de mas... como que si no consigue el EOF, pero no se porque el ejemplo de arriba no lo hace =.= Código Por favor alguien que me aclare porque no funciona el code del mensaje anterior y porque este da una vuelta de mas... Saludos... Título: Re: PROBLEMA con la funcion miembro getline() e ignore() Publicado por: Littlehorse en 27 Julio 2010, 01:19 am Código
El problema es que en este tipo de lecturas es que encontras el final cuando intentas leer en el, y no cuando leíste el ultimo elemento. Por eso mismo en este tipo de casos se comprueba o bien el valor exitoso del método utilizado en la lectura u métodos similares a ::eof. De lo contrario, imprimis ya pasado el EOF del archivo y por esa razon el ciclo tiene iteraciones de mas. En cuanto al primer código, getline es bastante particular y setea failbit por varias razones. En el caso que se extraigan n-1 caracteres y no se encuentre el delimitador, failbit se setea por tanto las siguientes operaciones pueden fallar. Código
Obviamente esa no es la solución ya que es ignorar el error, pero es simplemente para que veas que por ahí van los tiros. Lo ideal es parsear el archivo correctamente sin dejar nada al azar, pero igualmente la segunda solucion que pusiste puede funcionar correctamente siempre que se chequeen los flags de error y el final del archivo. También ten en cuenta que ignore tiene parámetros que puedes utilizar para sacarle mas provecho y evitar que ignore posibles datos necesarios. ::fail (http://www.cplusplus.com/reference/iostream/ios/fail/) ::bad (http://www.cplusplus.com/reference/iostream/ios/bad/) ::eof (http://www.cplusplus.com/reference/iostream/ios/eof/) Me dijiste antes que tenias otras dudas así que cualquier cosa ya sabes. Saludos! Título: Re: PROBLEMA con la funcion miembro getline() e ignore() Publicado por: .:BlackCoder:. en 27 Julio 2010, 01:50 am Jumm ahora me doy cuenta que toy grave :xD cuando getline setea el failbit las operaciones siguientes fallan? Eso no lo tengo claro, crei q setear el failbit no tenia importancia, que solo era para cuando uno quiera verificar errores y todo eso...
Weno lo que viene es un code larguito :xD pero pes como siempre quise hacer algo mas complejo, Agregar y quitar "registros" (Noten las comillas) a un archivo, pero de TEXTO, y ya se que lo ideal segun casi todos es que sea binario, pero pes lo quiero hacer en forma texto... en el fichero se deben ver mas o menos asi los registros: Pedro Perez :18 Maria Rodriguez :34 Ana Vergara :55 Un nombre completado con espacios para conseguir 29 caracteres mas ':' para... ni se para que digamos que para complicarme mas :xD y un entero que segun yo es la edad... mas su respectivo fin de linea... Tengo este code, con una funcion contar() que cuenta los "registros", una funcion extraer() que los extrae e ingresa en un vector de estructuras, otra ordenar() que ordena el vector de registros y otra agregaralfi() que pes agregar los registros al ficheros: El code funciona mas o menos xD: el problema es que despues de agregar a una persona me aparecio: Pedro Perez :18 Maria Rodriguez :34 Ana Vergara :55 Ð>:0 :0 :0 Antonio Mendoza :10 :xD Pero hace alguito el pobre code, esta muy feo y obviamente se puede mejorar pero quiero empezar por reparar esos simbolos extraños.... Aca lo dejo: Código
Muchas gracias littlehorse, disculpa la molestia y pes espero tu ayuda para luego si fortalecer el code... Saludos... Título: Re: PROBLEMA con la funcion miembro getline() e ignore() Publicado por: Littlehorse en 27 Julio 2010, 02:28 am Citar Jumm ahora me doy cuenta que toy grave :xD cuando getline setea el failbit las operaciones siguientes fallan? Eso no lo tengo claro, crei q setear el failbit no tenia importancia, que solo era para cuando uno quiera verificar errores y todo eso... Si, tiene importancia. Las operaciones siguientes realizadas en ese stream fallaran hasta que se vuelva al estado normal de ese stream. En cuanto al código, lo depuraste? tienes idea de mas o menos donde se produce el error? si sabes donde se produce la falla, especifica las lineas. Si no encontraste la falla en la logica, prueba revisando los valores de los datos paso por paso hasta encontrar el problema. Mañana lo miro atentamente a ver que encuentro, pero mientras prueba depurando. Saludos! Título: Re: PROBLEMA con la funcion miembro getline() e ignore() Publicado por: .:BlackCoder:. en 27 Julio 2010, 02:31 am Me imagino que el pedu esta en agregaralfi()... Estoy casi seguro, horita voy a comer, luego le doy y le doy otra vez :xD ya estuve toda la tarde en eso, que me ciente otro rato no quiere decir nada... :laugh:
EDITO: Mmmm el problema era una tonteria aca esta el code, lo hire editando poco a poco, se esperan criticas, consejos, ordenes :xD lo que sirva: Código
Saludos... Título: Re: PROBLEMA con la funcion miembro getline() e ignore() Publicado por: leogtz en 27 Julio 2010, 03:54 am Si tu programa no va a tener soporte para línea de comandos no tiene caso que utilices (argc y argv), es como declarar variables y no usarlas.
Título: Re: PROBLEMA con la funcion miembro getline() e ignore() Publicado por: .:BlackCoder:. en 27 Julio 2010, 03:59 am Ok... Algo mas? Ya modifique un par de cosas, como por ejemplo le agregue un manipulador para darle formato sin tener que precionar espacios :xD Luego le agrego un par de funciones...
Saludos... Título: Re: PROBLEMA con la funcion miembro getline() e ignore() Publicado por: leogtz en 27 Julio 2010, 04:16 am No uses system(), y menos para una tarea irrelevante como pausar el programa, utiliza algo como cin.get()
Un buen hábito de programación es declarar las clases o estructuras empezando con mayúscula. Estás usando C++ pero de manera estructurada, podrías usar un poco de POO y las funciones que usas hacerlas funciones miembro de la clase. Título: Re: PROBLEMA con la funcion miembro getline() e ignore() Publicado por: .:BlackCoder:. en 27 Julio 2010, 04:26 am La verdad que aunque me gusta C++ no soy bueno con la POO :xD pero voy a intentarlo... y lo de los nombre ya lo sabia pero todo empezo desde una cadena person :xD Ya voy a ver si hago algo orientado a objetos... aunque como es que vas a meter esas funciones como miembros? tu pensaste en que person sea una struct miembro de una clase? o que la clase sea person?...
Saludos Título: Re: PROBLEMA con la funcion miembro getline() e ignore() Publicado por: leogtz en 27 Julio 2010, 04:29 am No, no me di a entender.
Yo crearía una clase llamada Agenda, y apartir de ahí agregar sus funciones miembro como: extraer contar ordenar Etc, etc. |