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

La parte que no acabas de entender se basa en una regla muy simple: toda la memoria que bloqueas con 'new' tienes que liberarla con 'delete'. En este caso puedes hacer lo mismo con 'malloc' y 'free' porque estas trabajando con tipos char (con objetos no es aplicable).

Para liberar los campos O y D tienes que recorrer toda la lista y aplicarles el delete:

Código:
void buida_llista(list <DADES_ARXIU> *llista) {
    list <DADES_ARXIU>::iterator itr;
    
    for(itr = llista->begin(); itr != llista->end(); itr++) {
        delete [] (*itr).O;
        delete [] (*itr).D;
    }
    
    llista->clear();
}

//al finalizar llamas a la funcion
buida_llista(&llista);
La parte de bloquear memoria que la tienes comentada está bien:

Código:
case O: {
    camps.O = new char[strlen(pch)];
    memcpy(camps.O, pch, strlen(pch));                  
}
break;
Supongo que ya te habras dado cuenta: se guardan los caracteres sin dejar espacio para un \0 de final de texto; esto significa que si necesitas volcarlo a pantalla se puede dar el caso de que te muestre los caracteres seguidos de basura.

Y si no lo terminas de ver claro y no quieres liarte puedes dejar los campos O Y D como string y asignarles el pch tal como haces con P y FLA, pero es mas aburrido de programar.

Y la parte de reiniciar la struct no se si está bien pero me da la impresion de que no:

Código:
DADES_ARXIU zero = {0};
Con esto asignas 0 al primer elemento del struct, pero los demas ni se enteran. Si no llevara objetos (el string es un objeto) podrias aplicarle un memset y ya estaria; para ir sobre seguro me parece que deberias inicializar todos los campos del struct zero:

Código:
DADES_ARXIU zero = {0, 0, 0, 0, "", 0, "", 0, 0, 0, 0, 0};
Y para reiniciar el 'camps' le aplicas un memcpy y lo dejas como nuevo:

Código:
memcpy(&camps, &zero, sizeof(DADES_ARXIU));

vosk