Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - inserimento in lista da file
Forum - C/C++ - inserimento in lista da file

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
dr. palmito (Normal User)
Newbie


Messaggi: 4
Iscritto: 08/01/2014

Segnala al moderatore
Postato alle 8:20
Mercoledì, 08/01/2014
Salve a tutti,
volevo creare un programmino in c che leggendo da un file di testo inserisse in una una struct i campi del file, una riga per ogni struct e poi usando una lista concatenata metterli in ordine alfabetico.
I campi sono stringa stringa numero stringa.
Ho usato fscans perchè non so quanto è lunga ogni riga del file.
Intanto ho provato a fare questo codice che non ordina in ordine alfabetico, ma non funziona.

dove sbaglio?
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. typedef struct elenco
  6. {
  7.    char nome[50];              
  8.    char codice[4];              
  9.    int anno;                  
  10.    char luogo[50];              
  11. } elenco_t;
  12.  
  13. typedef struct elem_lista
  14. {
  15.    elenco_t info;          
  16.    struct elem_lista *succ_p;  
  17. } elem_lista_t;
  18.  
  19. typedef elem_lista_t *lista_p;
  20.  
  21. lista_p crea_lista();
  22. void Stampa_Lista (lista_p lista, elenco_t info);
  23.  
  24.  
  25. int main()
  26. {
  27.  
  28.    FILE *file_p;              
  29.    elenco_t info;      
  30.    lista_p lista;
  31.    lista_p prec, nuovo, corr;  
  32.    lista = crea_lista();
  33.          
  34.    if((file_p = fopen("prodotto.txt", "r")) == NULL)
  35.       printf("file non apribile\n");
  36.    else
  37.    {
  38.    
  39.    prec = NULL;
  40.    corr = lista;
  41.    
  42.    
  43.        
  44.     while (!feof(file_p))
  45.      {
  46.         fscanf(file_p,
  47.             "%s%s%d%s",
  48.             info.nome,
  49.             info.codice,
  50.             &info.anno,
  51.             info.luogo);  
  52.      
  53.      nuovo = (elem_lista_t *)malloc(sizeof(elem_lista_t));               
  54.      nuovo->info = info;
  55.      
  56.      if(prec == NULL)
  57.      {
  58.      nuovo->succ_p = lista;
  59.      lista = nuovo;
  60.      }
  61.      else
  62.      {
  63.      prec->succ_p = nuovo;
  64.      nuovo->succ_p = corr;
  65.      }
  66.      }
  67.    }
  68.   Stampa_Lista (lista, info);
  69.          
  70.  
  71.  fclose(file_p);
  72.  system("pause");
  73.  return 0;
  74.  
  75. }
  76.  
  77.  
  78. /* crea lista vuota */
  79. lista_p crea_lista()
  80. {
  81.    return NULL;
  82. }
  83.  
  84. /* stampa lista */
  85. void Stampa_Lista (lista_p lista, elenco_t info)
  86. {
  87.    while (lista != NULL)
  88.    {
  89.       printf(   "%s %s %d %s\n",
  90.                  info.nome,
  91.                  info.codice,
  92.                  info.anno,
  93.                  info.luogo);
  94.       lista = lista->succ_p;
  95.    }
  96. }


PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 10:05
Mercoledì, 08/01/2014
Ma questa tiga

nuovo->info = info;

cosa dovrebbe fare?

Non esiste un elemento info nella struttura quindi

nuovo->info

non ha senso


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
dr. palmito (Normal User)
Newbie


Messaggi: 4
Iscritto: 08/01/2014

Segnala al moderatore
Postato alle 10:47
Mercoledì, 08/01/2014
Info passa le informazioni dalla fscanf alla struttura elenco_t info che poi viene inserita nella lista elem_lista_t

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 12:39
Mercoledì, 08/01/2014
Non mi hai risposto ... Nella riga

nuovo->info

info non esiste all'interno della struttura ... come compila questo il tuo compilatore? Non hai errori?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
vbextreme (Normal User)
Newbie


Messaggi: 4
Iscritto: 16/12/2013

Segnala al moderatore
Postato alle 13:25
Mercoledì, 08/01/2014
Testo quotato

Ma questa tiga

nuovo->info = info;

cosa dovrebbe fare?

Non esiste un elemento info nella struttura quindi

nuovo->info

non ha senso



Codice sorgente - presumibilmente Plain Text

  1. lista_p prec, nuovo, corr;


di cui
Codice sorgente - presumibilmente C++

  1. typedef struct elem_lista
  2. {
  3.    elenco_t info;          
  4.    struct elem_lista *succ_p;  
  5. } elem_lista_t;
  6.  
  7. typedef elem_lista_t *lista_p;



Quindi esiste.
Una cosa errata invece è la tentata copia di strutture tramite l'operatore di assegnamento.
Codice sorgente - presumibilmente Plain Text

  1. nuovo->info = info;


Nel c andrebbe fatto:
Codice sorgente - presumibilmente Plain Text

  1. memcpy(&nuovo->info , &info, sizeof(info));


In alternativa si potrebbe usare direttamente la struttura:

Codice sorgente - presumibilmente Plain Text

  1. nuovo = (elem_lista_t *)malloc(sizeof(elem_lista_t));
  2.                 fscanf(file_p,
  3.                     "%s%s%d%s",
  4.                     nuovo->info.nome,
  5.                     nuovo->info.codice,
  6.                     &nuovo->info.anno,
  7.                     nuovo->info.luogo);




Per finire la cosa piu importante DEV-C++ è UNA CIOFECA DISINSTALLALO SUBITO!,in alternativa puoi usare l'ide piu simile ovvero CODE::BLOCKS.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 14:11
Mercoledì, 08/01/2014
Corretto ... avevo solamente guardato la prima struttura ... la fretta ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
dr. palmito (Normal User)
Newbie


Messaggi: 4
Iscritto: 08/01/2014

Segnala al moderatore
Postato alle 19:08
Mercoledì, 08/01/2014
In alternativa si potrebbe usare direttamente la struttura:

Codice sorgente - presumibilmente Plain Text

    nuovo = (elem_lista_t *)malloc(sizeof(elem_lista_t));
                    fscanf(file_p,
                        "%s%s%d%s",
                        nuovo->info.nome,
                        nuovo->info.codice,
                        &nuovo->info.anno,
                        nuovo->info.luogo);

Questo procedimento non mi funziona; il compilatore che purtroppo per adesso è dev c++ mi da errore.
Con il mio listato invece credo che il problema sia quando vado a stampare, mi compaiono sei righe tutte con lo stesso articolo.
se sposto la funzione di stampa mi compare la prima riga con l'articolo giusto, la seconda e la terza con il secondo articolo, la quarta, la quinta e la sesta con il terzo articolo e così via... non riesco a capire perchè non si prende gli articoli e se li infila in ogni nodo successivo.

PM Quote
Avatar
vbextreme (Normal User)
Newbie


Messaggi: 4
Iscritto: 16/12/2013

Segnala al moderatore
Postato alle 20:32
Mercoledì, 08/01/2014
Purtroppo non è una scusa,fintanto che userai dev-c++ non imparerai niente.
Scaricati CODE::BLOCKS che è il suo sinonimo ma funzionante!
Dopodiche(ovvero quando avrai scritto di nuovo il progetto e dato retta agli errori "corretti" che ti da il compilatore) ne riparleremo.Farlo prima è inutile, è come parlare con una balena con il tonnese.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 11:17
Giovedì, 09/01/2014
Dai retta a vbextreme e alla sua crociata contro DevC++ (ci leggiamo in tanti forum più di quelli che pensi ...) ...

In realtà DevC++/mingw è da evitare ... passa a quello che vuoi tu ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo