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: 5714
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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilitÓ) chiamava il gioco del Lotto Tassa sulla stupiditÓ.
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: 5714
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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilitÓ) chiamava il gioco del Lotto Tassa sulla stupiditÓ.
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: 5714
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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilitÓ) chiamava il gioco del Lotto Tassa sulla stupiditÓ.
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: 5714
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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilitÓ) chiamava il gioco del Lotto Tassa sulla stupiditÓ.
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo