Ver Mensaje Individual
  #5 (permalink)  
Antiguo 15/12/2012, 14:30
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Lectura de archivo en C++

Estas mezclando tipos con objetos, en las lineas 46 y 49 tienes

Código:
camps.EV = pch.c_srt();//ojo con la sintaxi: c_srt no es c_str
...
camps.T = atof(linia[pch]);
El metodo 'c_str()' forma parte de la libreria string y se aplica sobre objetos 'string', pero en la primera linea lo estas aplicando a un tipo char*; en la otra linea parece como si intentaras enviar a la funcion 'atof' un caracter de un objeto string, pero no funciona de esta manera: para el atof puedes enviarle directamente el pch porque es un char*

Si quieres asignar un char* a un char tienes que hacerlo de la forma mas facil:

Código:
camps.EV = pch[0];
char* es un array de char, por eso le asignas el primer elemento; para hacer esto es necesario la comprovacion de error de que pch no sea nulo, pero como en este caso es la misma condicion del ciclo no necesitas hacerlo y en ningun caso te puede dar error.


"...en mi código O y D, también me interesaría verlos como char. Ya que por ejemplo si es 1.0 cada una de las dos cifras me indica una cosa distinta...."

Lo tienes muy fácil, cambia el tipo float por un string (o añade un string) y asignale el pch

Código:
typedef struct {
    etc..
    float O;
    string sO;
} DADES_ARXIU;

case O: {
    camps.O = atof(pch);
    camps.sO = pch;
}
break;
O si quieres hacerlo mas divertido puedes guardarlo de forma dinamica y quedas como un señor:

Código:
typedef struct {
    etc..
    char *cO;
} DADES_ARXIU;

case O: {
    camps.cO = new char[strlen(pch)];
    memcpy(camps.cO, pch, strlen(pch));
}
break;
Si lo haces asi recuerda que para finalizar no hay suficiente con llista.clear() (que por cierto te lo has dejado), tendras que recorrer todos los elementos para hacer delete[]cO y al final llista.clear()

Otra cosa, la nueva estructura cargada tienes que añadirla a la lista al salir del ciclo 'while(pch)' y tu la estas añadiendo al evaluar cada campo de forma que te queda una llista de (nºcampos*nºfilas) cuando deberia quedarte una llista solo de (nºfilas):

Código:
while(getline(fitxer,linia)) {
    camp = EV;
    pch = strtok((char*)linia.c_str(), " ");
    while(pch) {
        switch(camp) {
            ...
        }
        pch = strtok (NULL, " ");
        camp++;
    }
    if(camp != I+1) {
        cout << "ERROR DE FITXER";
        return 1;
    }
    llista.push_back (camps);
}
Aun otra cosa, deberias implementar algo para vaciar la struct 'camps' antes de entrar al ciclo while(pch) porque representa que vas a cargar una nueva linea de datos


vosk