problema con ficheros :/

Iniciado por snowspring, 4 Junio 2018, 14:50 PM

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

snowspring

Hola buenas, me hayo haciendo un pequeño programa en C, en el cual una de las cosas que debe de hacer es crear una lista enlazada con los valores que le pasamos desde un fichero de texto, el problema es que al ejecutarlo me da "Violacion de segmento('core' generado)", y no encuentro el error.
El codigo que tengo es el siguiente:
int cargarListaEnlazadaTexto (ListaEnlazadaRef raiz, char *nombreFichero){

int cont=0;
tipoNodoRef aux, nuevo;
FILE *fid;
tipoInfoRef info;

if ((fid=fopen(nombreFichero, "r"))==NULL){
#ifdef DEBUG
fprintf(stderr, "Error: abriendo fichero\n");
#endif
return -1;
}else{
if(estaVacia(*raiz)){
crearVacia(raiz);
fscanf(fid, "%d ", info);
insertarNodoComienzo(raiz, info);
}
else if((fscanf(fid, "%d ", info))!=EOF){
while(fscanf(fid, "%d ", info)!=EOF){
aux=*raiz;
insertarOrdenada(&aux, info);
}

}else{
fclose(fid);
#ifdef DEBUG
fprintf(stderr, "Error: leyendo fichero\n");
#endif
return -2;
}

}
return 0;
}


**Todas las funciones a las que llamo dentro de la funcion funcionan a la perfeccion.

MAFUS

Te lías con los punteros:
seguro que estaVacia espera un puntero;
aux=*raiz; debería ser aux=raiz;
insertarOrdenada ¿espera un puntero a puntero?

snowspring

Cita de: MAFUS en  4 Junio 2018, 17:33 PM
Te lías con los punteros:
seguro que estaVacia espera un puntero;
aux=*raiz; debería ser aux=raiz;
insertarOrdenada ¿espera un puntero a puntero?
Lo de los punteros esta bien, igualmente lo he revisado y al cambiarlo a como me has dicho me dan errorres :/
Igualmente voy a dejar aqui los prototipos de las funciones que uso y los typedefs:

typedef int tipoInfo;

typedef tipoInfo *tipoInfoRef;




typedef struct tipoNodo {
tipoInfo info;
struct tipoNodo * sig;
} tipoNodo;
typedef tipoNodo *tipoNodoRef;


typedef tipoNodo * ListaEnlazada;
typedef ListaEnlazada *ListaEnlazadaRef;

/*Prototipos*/

int crearVacia(ListaEnlazadaRef raiz);
int estaVacia(ListaEnlazada raiz);
int insertarNodoComienzo(ListaEnlazadaRef raiz, tipoInfoRef info);
int insertarOrdenada(ListaEnlazadaRef raiz, tipoInfoRef info);

MAFUS

¿Podrías pasar todo el código para entender que hace el conjunto?

snowspring

#4
Cita de: MAFUS en  4 Junio 2018, 20:15 PM
¿Podrías pasar todo el código para entender que hace el conjunto?

[code=c]int crearVacia(ListaEnlazadaRef raiz){
*raiz=NULL; //tipoNodo** <> ListaEnlazadaRef
return 0; //tipoNodo*  <> ListaEnlazada
}


int estaVacia(ListaEnlazada raiz) {
return (raiz==NULL);

}

int insertarNodoComienzo(ListaEnlazadaRef raiz, tipoInfoRef info) {
return insertarAntesDeNodo(raiz,NULL,info);
}

int insertarAntesDeNodo(ListaEnlazadaRef raiz, tipoNodoRef pos, tipoInfoRef info){
tipoNodoRef nuevo, anterior;

if((nuevo=creaNodo(info))==NULL){
#ifdef DEBUG
fprintf(stderr, "Error: creando nodo\n");
#endif
return -1;
}else{
if(estaVacia(*raiz) || pos==NULL || pos==*raiz){
nuevo->sig=*raiz;
*raiz=nuevo;
}else{
anterior=*raiz; //ant=*raiz
while(anterior!=NULL && anterior->sig!=pos){
anterior=anterior->sig;

}

if(anterior!=NULL){
nuevo->sig=pos;
anterior->sig=nuevo;

}else{
free(nuevo);
#ifdef DEBUG
fprintf(stderr, "Error: posicion inexistente\n");
#endif
return -2;
}
}
return 0;
}
}

int insertarOrdenada(ListaEnlazadaRef raiz, tipoInfoRef info){
tipoNodoRef ant;

if(estaVacia(*raiz) || *info < (*raiz)->info)
return insertarNodoComienzo(raiz,info);
else{
ant=*raiz;
while(ant->sig!=NULL && ant->sig->info < *info){
ant = ant->sig;
}
return insertarDespuesDeNodo(raiz, ant, info);
}
}

   int cargarListaEnlazadaTexto (ListaEnlazadaRef raiz, char *nombreFichero){
   
    int cont=0;
    tipoNodoRef aux, nuevo;
    FILE *fid;
    tipoInfoRef info;
   
    if ((fid=fopen(nombreFichero, "r"))==NULL){
   #ifdef DEBUG
    fprintf(stderr, "Error: abriendo fichero\n");
   #endif
    return -1;
    }else{
    if(estaVacia(*raiz)){
    crearVacia(raiz);
    fscanf(fid, "%d ", info);
    insertarNodoComienzo(raiz, info);
    }
    else if((fscanf(fid, "%d ", info))!=EOF){
    while(fscanf(fid, "%d ", info)!=EOF){
    aux=*raiz;
    insertarOrdenada(&aux, info);
    }
   
    }else{
    fclose(fid);
   #ifdef DEBUG
    fprintf(stderr, "Error: leyendo fichero\n");
   #endif
    return -2;
    }
   
    }
    return 0;
   }
[/code]

Y bueno aqui estaria la llamada en el main:
[code=c]printf("Introduce el nombre de la lista de la cual quieres coger los datos: ");
    scanf("%s%*c", nombreFichero);
    printf("Guardando fichero en lista: %d\n", cargarListaEnlazadaTexto(&raiz, nombreFichero));
[/code]

(espero no haberme liado al copiar nada que no tenga que ver ni nada por el estilo :/ )