У меня есть некоторые проблемы со связанными списками - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть некоторые проблемы с моим кодом.Я хочу загрузить файл (я могу сделать это в функции "cargar"), у меня есть мое меню, моя функция "показать список" (mostrar_lista) и моя "функция добавления" (anadir_elemento), но у меня есть проблемы сguardar (моя функция сохранения).

Когда я использую свою функцию сохранения (guardar), я ничего не могу сохранить, мой файл "records.txt" просто сворачивается, и у меня есть файл с 700.000 Кбайт.

Код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

struct unDisco{
    char titulo[100];   
    char artista[100];  
    short fecha;
    char formato[50];
    float precio;
    struct unDisco *siguiente;
};
struct unDisco *primero, *ultimo;


void cargar(){ 
    FILE *discoteca;
    discoteca = fopen("records.txt","r");
    if (discoteca==NULL){
        return ;    
    }else{
        char ayuda, titulo[100], artista[100], formato[50];
        int cont=0, k, fecha, n;
        float precio;
        while((ayuda=fgetc(discoteca))!=EOF){  
        if (ayuda=='\n'){
            cont++; 
        }
    }

    rewind(discoteca);  

    char linea[cont][1024];
    for (k=0;k<cont;k++){
        fgets(linea[k],1023,discoteca);
        struct unDisco *disco=(struct unDisco *)malloc(sizeof(struct unDisco));
        sscanf(linea[k]," %s %s %i %s %f", titulo,artista,&fecha,formato,&precio);
        strcpy(disco->titulo, titulo);
        strcpy(disco->artista, artista);
        strcpy(disco->formato, formato);
        disco->fecha=fecha;
        disco->precio=precio;


        if (primero==NULL) {
             primero = disco;
             ultimo = disco;
        }
        else {
             ultimo->siguiente = disco;
             ultimo = disco;
        }
    }
}
fclose(discoteca);
return ;
}

 void mostrar_menu() {
  printf("\n\nMenú:\n=====\n\n");
  printf("1.- Añadir elementos\n");
  printf("2.- Borrar elementos\n");
  printf("3.- Mostrar lista\n");
  printf("4.- Salir\n\n");
  printf("Escoge una opción: ");fflush(stdout);
 }


 void anadir_elemento() {
  struct unDisco *disco;
  int data;
  float prezo;
  char titulo[100],artista[100],formato[50];

  //reservamos memoria para el nuevo elemento 
  disco = (struct unDisco *) malloc (sizeof(struct unDisco));


  printf("\nTitulo: "); fflush(stdout);
  fscanf(stdin," %s",titulo);
  printf("Artista: "); fflush(stdout);
  fscanf(stdin," %s",artista);
  printf("Fecha: "); fflush(stdout);
  fscanf(stdin," %i",&data);
  printf("Formato: "); fflush(stdout);
  fscanf(stdin," %s",formato);
  printf("Precio: "); fflush(stdout);
  fscanf(stdin," %f",&prezo);
  strcpy(disco->titulo, titulo);
  strcpy(disco->artista, artista);
  strcpy(disco->formato, formato);
  disco->fecha=data;
  disco->precio=prezo;

  // el campo siguiente va a ser NULL por ser el último elemento de la lista

  disco->siguiente = NULL;

  // ahora metemos el nuevo elemento en la lista. lo situamos al final de la lista 
  //comprobamos si la lista está vacía. si primero==NULL es que no hay ningún elemento en la lista. también vale ultimo==NULL

  if (primero==NULL) {
     printf( "Primer elemento\n");
     primero = disco;
     ultimo = disco;
     }
  else {
       // el que hasta ahora era el último tiene que apuntar al nuevo
       ultimo->siguiente = disco;
       // hacemos que el nuevo sea ahora el último 
       ultimo = disco;
  }
 }

 void mostrar_lista() {
  struct unDisco *auxiliar; // lo usamos para recorrer la lista 
  int i;

  i=0;
  auxiliar = primero;
  printf("\nMostrando la lista completa:\n");
  while (auxiliar!=NULL) {
        printf( "Titulo: %s, Artista: %s, Fecha: %i, Formato: %s, Precio: %.2f",
                auxiliar->titulo,auxiliar->artista,auxiliar->fecha,auxiliar->formato,auxiliar->precio);
        auxiliar = auxiliar->siguiente;
        i++;
  }
  if (i==0) printf( "\nLa lista está vacía!!\n" );
 }


void guardar(){
FILE *discoteca;
struct unDisco *disco;
discoteca=fopen("records.txt","w");
    while(disco->siguiente!=NULL){
        fprintf(discoteca,"%s %s %i %s %.2f\n",
            disco->titulo, disco->artista, disco->fecha, disco->formato, disco->precio);
    }
    fclose(discoteca);
}


int main(){

char opcion;
     cargar();
     primero = (struct unDisco *) NULL;
     ultimo = (struct unDisco *) NULL;
     do {
         mostrar_menu();
         fscanf(stdin," %c",&opcion);
             switch ( opcion ) {
                case '1': anadir_elemento();
                       break;
                case '2':  printf("No disponible todavía!\n");
                        break;
                case '3': mostrar_lista(primero);
                        break;
                case '4': 
                  guardar();
                  exit( 1 );
                  break;
               default: printf( "Opción no válida\n" );
                         break;
             }
     } while (opcion!='4');

return 0;
}

1 Ответ

0 голосов
/ 30 декабря 2018

кажется логичным, что guardar получает параметр unDisco , что-то вроде

void guardar(struct unDisco *disco){
  FILE *discoteca = fopen("records.txt","w");

  while(disco != NULL) { /* <<< test changed */
    fprintf(discoteca,"%s %s %i %s %.2f\n",
            disco->titulo, disco->artista,
            disco->fecha, disco->formato, 
            disco->precio);
    disco = disco->siguiente; /* <<< added */
  }
  fclose(discoteca);
}
...