Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2015
    Messaggi
    10

    Problema con una funzione "SORGENTE IN C"

    Salve a tutti, sto sviluppando un semplice programma, un roster di piloti ho un problema nella funzione LEGGIFILE, una volta salvato il file esco dal programma poi lo riapro gli faccio leggere il file e lui mi genera una lista che quando vado a visualizzarla il primo pilota è l'ultimo che c'era nel file quindi alla rovescia.
    Ho fatto tantissime prove senza realizzare nulla, vorrei che per come il roster venga salvato me lo deve visualizzare quindi nello stesso ordine.

    Grazie in anticipo per la disponibilità.

    Di seguito riporto il codice della funzione


    codice:
    struct elemento *LeggiFile(struct elemento *p)
    {
      struct Pilota DaInserire;
      struct elemento *punt;
      struct Pilota vuoto;
      int scelta;
    
    
      printf("Leggere il roster di default??  1 (si),  0 (no) ----> ");
      scanf("%d", &scelta);
      
      if(scelta == 0)
        return;
    
      FILE *stream = fopen("roster.txt", "r");
      if (stream == NULL)
        {
          printf("\n\n*****************************************************************************\n");
          printf("ERRORE NELLA LETTURA DEL ROSTER, POTREBBE NON ESISTERE O ESSERE VUOTO\n\n");
          printf("*****************************************************************************\n");
      return 0;
        }
      
      while (!feof(stream))
        {
          fscanf(stream, "%s\t%s\t%s\t%s\t%s\t%s\n\n", DaInserire.callsign, DaInserire.nome, DaInserire.status, DaInserire.grado, DaInserire.squadriglia, DaInserire.ruolo);
    
          punt = (struct elemento *)malloc(sizeof(struct elemento));
          punt->inf = DaInserire;
          punt->succ = p;
          p = punt;
          DaInserire = vuoto;
        
        
        }
    
    
    
    
      fflush(stream);
      fclose(stream);
    
      printf("\n\n************@@@@@@@@@@@@@@@@@@@@@@@@@************\n");
      printf("************                         ************\n");
      printf("************ROSTER LETTO CON SUCCESSO************\n");
      printf("************                         ************\n");
      printf("************@@@@@@@@@@@@@@@@@@@@@@@@@************\n");
      
      
      return (punt);
    }
    Se avete bisogno del sorgente completo lo pubblico.
    Ultima modifica di MItaly; 10-02-2015 a 14:43 Motivo: Tag CODE

  2. #2
    Alloca il nuovo elemento in coda anziché in testa come fai ora.
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2015
    Messaggi
    10
    È proprio questo il mio problema.. Dovrei usare un puntatore ausiliario?? Se sì come lo inizializzo?

  4. #4
    Crei il primo elemento e gli assegni DaInserire
    poi assegni i successivi elementi a p->succ
    ti sposti su p->succ continui.
    assegni NULL all'ultimo ed hai fatto.

    Una domanda, perché passi struct elemento alla funzione ? la lista potrebbe non essere vuota ?
    Se la lista deve essere comunque vuota (NULL) il parametro è inutile, è sufficente che restituisca il primo elemento della lista che crei.
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2015
    Messaggi
    10
    a

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2015
    Messaggi
    10
    si la lista potrebbe non essere vuota in tal caso avrei dei problemi..comunque riguardo a ciò che mi hai consigliato ho incominciato da poco con le liste e ho un pò di difficoltà ancora a capire il meccanismo quindi come creo il primo elemento dentro il ciclo? e successivamente a p->succ come gli assegno i successivi elementi?

  7. #7
    Prima fase:
    Se p è NULL (la lista è vuota) crei il primo elemento e gli assegni la prima riga del file
    Invece se p non è NULL (la lista non è vuota) scorri tutta la lista fino alla fine.

    Seconda fase:
    crei ogni nuovo nodo in coda punt->succ = (struct elemento *)malloc(sizeof(struct elemento)); e gli assegni le stringhe della riga corrente. continui fino alla fine del file, in fondo non cambia poi molto rispetto codice che hai già creato.

    Per semplicità ti consiglierei di usare una funzione che crea un nuovo nodo elemento, legge le stringhe dal file aperto e glieli assegna, per poi restituire il puntatore.

    esempio
    codice:
    struct elemento *readLine( FILE *stream )
    {
    Ultima modifica di Samuele_70; 09-02-2015 a 23:24
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2015
    Messaggi
    10
    Si la funzione che mi crea il nodo magari la farò dopo che risolverò questo problema..comunque ho fatto come mi hai detto (non so se ho scritto il sorgente esatto) ma ancora non funziona sicuramente sbaglio a scrivere qualcosa!!!

    SORGENTE:

    codice:
     
     FILE *stream = fopen("roster.txt", "r");
     
      if (p == NULL)
        {
          fscanf(stream, "%s\t%s\t%s\t%s\t%s\t%s\n\n", DaInserire.callsign, DaInserire.nome, DaInserire.status, DaInserire.grado, DaInserire.squadriglia, DaInserire.ruolo);
           punt = (struct elemento *)malloc(sizeof(struct elemento));
           punt->inf = DaInserire;
           punt->succ = NULL;
           DaInserire = vuoto;
        }
    
      if (p != NULL)
        {
          p = p->succ;
        }
    
      
      while (!feof(stream))
        {
          fscanf(stream, "%s\t%s\t%s\t%s\t%s\t%s\n\n", DaInserire.callsign, DaInserire.nome, DaInserire.status, DaInserire.grado, DaInserire.squadriglia, DaInserire.ruolo);
          
          punt->succ = (struct elemento *)malloc(sizeof(struct elemento));
          punt->inf = DaInserire;
          p = punt;
          DaInserire = vuoto;
          
        
        }
    Ultima modifica di MItaly; 10-02-2015 a 14:43 Motivo: Tag CODE

  9. #9
    Quote Originariamente inviata da fabrymus Visualizza il messaggio
    Si la funzione che mi crea il nodo magari la farò dopo che risolverò questo problema..comunque ho fatto come mi hai detto (non so se ho scritto il sorgente esatto) ma ancora non funziona sicuramente sbaglio a scrivere qualcosa!!!

    SORGENTE:


    codice:
     
     FILE *stream = fopen("roster.txt", "r");
     
      if (p == NULL)
        {
          fscanf(stream, "%s\t%s\t%s\t%s\t%s\t%s\n\n", DaInserire.callsign, DaInserire.nome, DaInserire.status, DaInserire.grado, DaInserire.squadriglia, DaInserire.ruolo);
    
    
           p= (struct elemento *)malloc(sizeof(struct elemento));  
    punt = p;
    
    
           punt->inf = DaInserire;
           punt->succ = NULL;
           DaInserire = vuoto;
        }
    else
    
            while( punt->succ ) //...Scorro la lista in cerca dell'ultimo elemento
                punt = punt->succ;
        
    
      
      while (!feof(stream))
        {
          fscanf(stream, "%s\t%s\t%s\t%s\t%s\t%s\n\n", DaInserire.callsign, DaInserire.nome, DaInserire.status, DaInserire.grado, DaInserire.squadriglia, DaInserire.ruolo);
          
          punt->succ = (struct elemento *)malloc(sizeof(struct elemento));
    
          punt = punt->succ; // Mi sposto al nodo successivo;
    
    punt->inf = DaInserire;
    punt->succ = NULL;
    
          DaInserire = vuoto;
          
    }
    
    return p; // Restituisce il primo elemento della lista
    Ho apportato qualche correzione 'al volo', non l'ho provato quindi ci saranno sicuramente degli errori. Ma ti ho evidenziato alcuni problemi.
    Ultima modifica di MItaly; 10-02-2015 a 14:43
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2015
    Messaggi
    10
    Grazie infinite il codice funziona i miei errori in pratica erano nel while che avevo provato anche io solo che mi spostavo erroneamente fin quando p era != da NULL il che è sbagliato perchè si ferma a NULL e non all'ultimo elemento.

    Grazie del supporto sei grande .

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.