Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Atoi no funciona

Estas en el tema de Atoi no funciona en el foro de C/C++ en Foros del Web. Hola a todos. Tengo un problema al usar la función atoi de c++. Verán, lo que necesito es cargar unos archivos de texto plano a ...
  #1 (permalink)  
Antiguo 17/11/2013, 18:31
 
Fecha de Ingreso: noviembre-2013
Mensajes: 2
Antigüedad: 10 años, 5 meses
Puntos: 0
Pregunta Atoi no funciona

Hola a todos.
Tengo un problema al usar la función atoi de c++. Verán, lo que necesito es cargar unos archivos de texto plano a una lista de datos. Eso ya lo tengo. Algunos de esos datos son tipo int y necesito convertirlos de string a int. Lo que hice es que cada linea contenga todo lo que va en un nodo de la lista separado por tabuladores, leo la linea con getline y la almaceno en una variable string y después compruebo en donde esta el tabulador y lo almaceno en otra variable tipo string. Como son varias lineas tengo eso en un ciclo while para que lea todas las lineas del archivo.

Pero aquí viene el problema: En el primer bucle lee todos los datos prefecto, pero desde el segundo, los valores que debería convertir a int los pone 0. Los otros datos no importa porque quiero que se mantengan como string, pero los datos numéricos les pone cero.

El código es el siguiente:
Código:
ifstream archivoListaLibros("ListaLibros.txt");
if(!archivoListaLibros.fail())
	{
		string aux,auxLibro[8];
		while(getline(archivoListaLibros,aux))
		{
			int i=0,j=0;
			for(;aux[i]!='\t';i++)auxLibro[j]+=aux[i];
			i++;j++;
			for(;aux[i]!='\t';i++)auxLibro[j]+=aux[i];
			i++;j++;
			for(;aux[i]!='\t';i++)auxLibro[j]+=aux[i];
			i++;j++;
			for(;aux[i]!='\t';i++)auxLibro[j]+=aux[i];
			i++;j++;
			for(;aux[i]!='\t';i++)auxLibro[j]+=aux[i];
			i++;j++;
			for(;aux[i]!='\t';i++)auxLibro[j]+=aux[i];
			i++;j++;
			for(;aux[i]!='\t';i++)auxLibro[j]+=aux[i];
			i++;j++;
			for(;aux[i]!='\0';i++)auxLibro[j]+=aux[i];
			
			listaLibros->agregarLibro(atoi(auxLibro[0].c_str()),	//Algo aquí falla en el segundo bucle
									  auxLibro[1],
									  auxLibro[2],
									  atoi(auxLibro[3].c_str()),	//Algo también
									  auxLibro[4],
									  auxLibro[5],
									  atoi(auxLibro[6].c_str()),	//Algo también
									  atoi(auxLibro[7].c_str()));	//y aquí
			
			for(int k=0;k<=j;k++){
				for(int l=0;l<auxLibro[k].size();l++)
					auxLibro[k][l]='\0';
			}
			for(int l=0;l<aux.size();l++)
				aux[l]='\0';
		}
	}
archivoListaLibros.close();
El archivo ListaLibros.txt contiene
Código:
123456789	Don Quijote de la Mancha	Miguel de Cervantes	1900	Es la historia de un viejo que se cree caballero	Editorial Magenta	123	5
987654321	Sherlock Holmes	EdgarSalguero	2000	Detective en busca de la verdad	Editorial Cian	321	10
13579	Mundos magicos	andres	2013	Esto es una descripcion	Editorial Yellow	65	3
Pero en la lista se almacena asi:
Código:
		ISBN: 0
		Titulo: Sherlock Holmes
		Autor: EdgarSalguero
		Anio: 0
		Descripcion: Detective en busca de la verdad
		Editorial: Editorial Cian
		Numero de pagina: 0
		Cantidad: 0

		ISBN: 123456789
		Titulo: Don Quijote de la Mancha
		Autor: Miguel de Cervantes
		Anio: 1900
		Descripcion: Es la historia de un viejo que se cree caballero
		Editorial: Editorial Magenta
		Numero de pagina: 123
		Cantidad: 5

		ISBN: 0
		Titulo: Mundos magicos
		Autor: andres
		Anio: 0
		Descripcion: Esto es una descripcion
		Editorial: Editorial Yellow
		Numero de pagina: 0
		Cantidad: 0
Por favor, necesito su ayuda porque no entiendo realmente donde esta el error. Gracias de antemano
  #2 (permalink)  
Antiguo 18/11/2013, 02:28
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Atoi no funciona

Haz un cout del texto que guardas en auxLibro[0], tal vez no estes leyendo lo ue esperas (si es asi es que el metodo de parseo que usas no es el correcto).

Saludos
vosk
  #3 (permalink)  
Antiguo 18/11/2013, 02:48
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Atoi no funciona

Te comento un cosa, usa el strtok (está en string.h) para tokenizar por tabuladores; en c++ puede que haya algun equivalente de esta funcion heredada de c pero no lo se. Con strtok:

Código C:
Ver original
  1. char *tok;
  2. string aux,auxLibro[8];
  3. int campo;
  4.  
  5. ifstream archivoListaLibros("ListaLibros.txt");
  6. if(!archivoListaLibros.fail()) {
  7.     while(getline(archivoListaLibros,aux)) {
  8.         tok = strtok((char *)aux.c_str(), "\t");
  9.         campo = 0;
  10.         while(tok) {
  11.             auxLibro[campo++] = tok;
  12.  
  13.             tok = strtok(0, "\t");
  14.         }
  15.     }
  16. }
  17. archivoListaLibros.close();

Puede que en c++ haya algo equivalente a strtok para trabajar con string pero no lo se, es cuestion de revisar el manual

Saludos
vosk
  #4 (permalink)  
Antiguo 18/11/2013, 15:07
 
Fecha de Ingreso: noviembre-2013
Mensajes: 2
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: Atoi no funciona

Gracias a todos por responder. Ya encontre el problema. Es que el arreglo de string no se limpia en cada bucle por lo que se almacena el caracter '\0' y concatena con el nuevo string que le viene. Pro eso el atoi no podia convertirlos.

Lo solucione declarando el string auxLibro[8] dentro del while.

Etiquetas: c++, int, lista, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:39.