Problema con STRTok, Char y String [C++]

Iniciado por ZedGe, 24 Diciembre 2011, 20:12 PM

0 Miembros y 1 Visitante están viendo este tema.

ZedGe

Este codigo lee un archivo txt el cual puede tener algo asi

perro,gato,arbol,casa
gato,pato,girafa,pelota
....
....

el problema que uso el STRtok para guardar esas variables en un char[xxx], es decir, guardo las variables sin las comas..
asd[0] = perro;
asd[1] = gato;
...
..

el problema que al usar char y puntero me sale error: invalid conversion  from 'char*' to 'char'
La idea es tratar de uno usar string, ya que al poner mi datoguardado como string en vez de char funciona correcto de la forma que lo tengo no



#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstring>

using namespace std;

int main()
{

char linea[128];
char *ptrToken;
int i=0;
char datoguardado[200];

ifstream entrada("texto.txt");
ifstream input;
input.open("texto.txt");

if (entrada.fail() )
{
        cout << "Error al tratar de abrir archivo \n";
        cin.get();
      return 1;
}

while(!entrada.eof()){

entrada.getline(linea, sizeof(linea));
ptrToken = strtok(linea, "," );

while ( ptrToken != NULL ) {
      datoguardado[i] = ptrToken;
      i++;
      ptrToken = strtok(NULL, "," );
  }
}
entrada.close();
input.close();
return 0;
}




ZedGe

se me ocurrio dejarlo como


string dato[200];

y luego use el cambio de

const char *dato1 = dato[j++].c_str();

ya que mis datos deben ser const char* por que la función que los usa usa ese tipo de dato


alguna idea para no usar c_str y hacerlo altiro mientras se lee el archivo?

satu

Hola

El problema está aquí:
Código (cpp) [Seleccionar]

ptrToken = strtok(linea, "," );
datoguardado[i] = ptrToken;

ya que ptrToken es de tipo char* y datoguardado[ i ] es un char. La solución más rápida sería declarar datoguardado como un array bidimensional:
Código (cpp) [Seleccionar]

char datoguardado[100][30]; // asi podras guardar hasta 100 peliculas con el nombre de hasta 30 caracteres cada una


Si lo haces así acuérdate de que los char* no se asignan con =, sino con strcpy/strncpy:
Código (cpp) [Seleccionar]

strcpy(datoguardado[i], ptrToken);


Saludos
Breakbeat como forma de vida

ZedGe

La ultima pregunta (me funciono todo perfecto), si quiero N películas como tu ejemplo, como hago para darle el numero de películas?


char nombre[][];
nombre=(char**)malloc(n*sizeof(char*)); //n=numero de cadenas
//luego, para cada cadena:
nombre[i]=(char*)malloc(n*sizeof(char)); // n= numero de caracteres en la cadena



asi deberia ser?

ZedGe

Cita de: ZedGe en 27 Diciembre 2011, 03:20 AM
La ultima pregunta (me funciono todo perfecto), si quiero N películas como tu ejemplo, como hago para darle el numero de películas?


char nombre[][];
nombre=(char)malloc(n*sizeof(char)); //n=numero de cadenas
//luego, para cada cadena:
nombre[i]=(char)malloc(n*sizeof(char)); // n= numero de caracteres en la cadena



asi deberia ser?

satu

Hola

Sí, así es como debes hacerlo. Aunque recuerda que después debes liberar la memoria con free.

Saludos
Breakbeat como forma de vida

ZedGe