Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: snowspring en 4 Junio 2018, 14:50 pm



Título: problema con ficheros :/
Publicado por: snowspring en 4 Junio 2018, 14:50 pm
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:
Código
  1. int cargarListaEnlazadaTexto (ListaEnlazadaRef raiz, char *nombreFichero){
  2.  
  3. int cont=0;
  4. tipoNodoRef aux, nuevo;
  5. FILE *fid;
  6. tipoInfoRef info;
  7.  
  8. if ((fid=fopen(nombreFichero, "r"))==NULL){
  9. #ifdef DEBUG
  10. fprintf(stderr, "Error: abriendo fichero\n");
  11. #endif
  12. return -1;
  13. }else{
  14. if(estaVacia(*raiz)){
  15. crearVacia(raiz);
  16. fscanf(fid, "%d ", info);
  17. insertarNodoComienzo(raiz, info);
  18. }
  19. else if((fscanf(fid, "%d ", info))!=EOF){
  20. while(fscanf(fid, "%d ", info)!=EOF){
  21. aux=*raiz;
  22. insertarOrdenada(&aux, info);
  23. }
  24.  
  25. }else{
  26. fclose(fid);
  27. #ifdef DEBUG
  28. fprintf(stderr, "Error: leyendo fichero\n");
  29. #endif
  30. return -2;
  31. }
  32.  
  33. }
  34. return 0;
  35. }

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


Título: Re: problema con ficheros :/
Publicado por: 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?


Título: Re: problema con ficheros :/
Publicado por: snowspring en 4 Junio 2018, 19:10 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:
Código
  1. typedef int tipoInfo;
  2.  
  3. typedef tipoInfo *tipoInfoRef;
  4.  
  5.  
  6.  
  7.  
  8. typedef struct tipoNodo {
  9. tipoInfo info;
  10. struct tipoNodo * sig;
  11. } tipoNodo;
  12. typedef tipoNodo *tipoNodoRef;
  13.  
  14.  
  15. typedef tipoNodo * ListaEnlazada;
  16. typedef ListaEnlazada *ListaEnlazadaRef;
  17.  
  18. /*Prototipos*/
  19.  
  20. int crearVacia(ListaEnlazadaRef raiz);
  21. int estaVacia(ListaEnlazada raiz);
  22. int insertarNodoComienzo(ListaEnlazadaRef raiz, tipoInfoRef info);
  23. int insertarOrdenada(ListaEnlazadaRef raiz, tipoInfoRef info);


Título: Re: problema con ficheros :/
Publicado por: MAFUS en 4 Junio 2018, 20:15 pm
¿Podrías pasar todo el código para entender que hace el conjunto?


Título: Re: problema con ficheros :/
Publicado por: snowspring en 4 Junio 2018, 20:29 pm
¿Podrías pasar todo el código para entender que hace el conjunto?
Código
  1. [code=c]int crearVacia(ListaEnlazadaRef raiz){
  2. *raiz=NULL; //tipoNodo** <> ListaEnlazadaRef
  3. return 0; //tipoNodo*  <> ListaEnlazada
  4. }
  5.  
  6.  
  7. int estaVacia(ListaEnlazada raiz) {
  8. return (raiz==NULL);
  9.  
  10. }
  11.  
  12. int insertarNodoComienzo(ListaEnlazadaRef raiz, tipoInfoRef info) {
  13. return insertarAntesDeNodo(raiz,NULL,info);
  14. }
  15.  
  16. int insertarAntesDeNodo(ListaEnlazadaRef raiz, tipoNodoRef pos, tipoInfoRef info){
  17. tipoNodoRef nuevo, anterior;
  18.  
  19. if((nuevo=creaNodo(info))==NULL){
  20. #ifdef DEBUG
  21. fprintf(stderr, "Error: creando nodo\n");
  22. #endif
  23. return -1;
  24. }else{
  25. if(estaVacia(*raiz) || pos==NULL || pos==*raiz){
  26. nuevo->sig=*raiz;
  27. *raiz=nuevo;
  28. }else{
  29. anterior=*raiz; //ant=*raiz
  30. while(anterior!=NULL && anterior->sig!=pos){
  31. anterior=anterior->sig;
  32.  
  33. }
  34.  
  35. if(anterior!=NULL){
  36. nuevo->sig=pos;
  37. anterior->sig=nuevo;
  38.  
  39. }else{
  40. free(nuevo);
  41. #ifdef DEBUG
  42. fprintf(stderr, "Error: posicion inexistente\n");
  43. #endif
  44. return -2;
  45. }
  46. }
  47. return 0;
  48. }
  49. }
  50.  
  51. int insertarOrdenada(ListaEnlazadaRef raiz, tipoInfoRef info){
  52. tipoNodoRef ant;
  53.  
  54. if(estaVacia(*raiz) || *info < (*raiz)->info)
  55. return insertarNodoComienzo(raiz,info);
  56. else{
  57. ant=*raiz;
  58. while(ant->sig!=NULL && ant->sig->info < *info){
  59. ant = ant->sig;
  60. }
  61. return insertarDespuesDeNodo(raiz, ant, info);
  62. }
  63. }
  64.  
  65.    int cargarListaEnlazadaTexto (ListaEnlazadaRef raiz, char *nombreFichero){
  66.  
  67.     int cont=0;
  68.     tipoNodoRef aux, nuevo;
  69.     FILE *fid;
  70.     tipoInfoRef info;
  71.  
  72.     if ((fid=fopen(nombreFichero, "r"))==NULL){
  73.    #ifdef DEBUG
  74.     fprintf(stderr, "Error: abriendo fichero\n");
  75.    #endif
  76.     return -1;
  77.     }else{
  78.     if(estaVacia(*raiz)){
  79.     crearVacia(raiz);
  80.     fscanf(fid, "%d ", info);
  81.     insertarNodoComienzo(raiz, info);
  82.     }
  83.     else if((fscanf(fid, "%d ", info))!=EOF){
  84.     while(fscanf(fid, "%d ", info)!=EOF){
  85.     aux=*raiz;
  86.     insertarOrdenada(&aux, info);
  87.     }
  88.  
  89.     }else{
  90.     fclose(fid);
  91.    #ifdef DEBUG
  92.     fprintf(stderr, "Error: leyendo fichero\n");
  93.    #endif
  94.     return -2;
  95.     }
  96.  
  97.     }
  98.     return 0;
  99.    }
[/code]

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

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