Oppure

Loading
08/01/14 7:20
dr. palmito
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?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct elenco
{
   char nome[50];               
   char codice[4];              
   int anno;                   
   char luogo[50];              
} elenco_t;

typedef struct elem_lista
{
   elenco_t info;          
   struct elem_lista *succ_p;   
} elem_lista_t;

typedef elem_lista_t *lista_p;

lista_p crea_lista();
void Stampa_Lista (lista_p lista, elenco_t info);


int main()
{

   FILE *file_p;               
   elenco_t info;      
   lista_p lista;
   lista_p prec, nuovo, corr;  
   lista = crea_lista(); 
          
   if((file_p = fopen("prodotto.txt", "r")) == NULL)
      printf("file non apribile\n");
   else
   { 
   
   prec = NULL;
   corr = lista;
   
   
        
    while (!feof(file_p))
     {
	fscanf(file_p, 
            "%s%s%d%s",
            info.nome,
            info.codice,
            &info.anno,
            info.luogo);  
      
     nuovo = (elem_lista_t *)malloc(sizeof(elem_lista_t));	         
     nuovo->info = info;
     
     if(prec == NULL)
     {
     nuovo->succ_p = lista;
     lista = nuovo;
     }
     else
     {
     prec->succ_p = nuovo;
     nuovo->succ_p = corr;
     }
     }
   }
  Stampa_Lista (lista, info);
         
 
 fclose(file_p);
 system("pause");
 return 0;
 
}


/* crea lista vuota */
lista_p crea_lista()
{
   return NULL;
}

/* stampa lista */
void Stampa_Lista (lista_p lista, elenco_t info)
{
   while (lista != NULL)
   {
      printf(   "%s %s %d %s\n",
                 info.nome,
                 info.codice,
                 info.anno,
                 info.luogo);
      lista = lista->succ_p;
   }
}
aaa
08/01/14 9:05
nessuno
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à.
08/01/14 9:47
dr. palmito
Info passa le informazioni dalla fscanf alla struttura elenco_t info che poi viene inserita nella lista elem_lista_t
aaa
08/01/14 11:39
nessuno
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à.
08/01/14 12:25
vbextreme
Ma questa tiga

nuovo->info = info;

cosa dovrebbe fare?

Non esiste un elemento info nella struttura quindi

nuovo->info

non ha senso


lista_p prec, nuovo, corr;

di cui
typedef struct elem_lista
{
   elenco_t info;          
   struct elem_lista *succ_p;  
} elem_lista_t;
 
typedef elem_lista_t *lista_p;


Quindi esiste.
Una cosa errata invece è la tentata copia di strutture tramite l'operatore di assegnamento.
nuovo->info = info; 

Nel c andrebbe fatto:
memcpy(&nuovo->info , &info, sizeof(info));

In alternativa si potrebbe usare direttamente la struttura:

             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);



Per finire la cosa piu importante DEV-C++ è UNA CIOFECA DISINSTALLALO SUBITO!,in alternativa puoi usare l'ide piu simile ovvero CODE::BLOCKS.
aaa
08/01/14 13:11
nessuno
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à.
08/01/14 18:08
dr. palmito
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.
aaa
08/01/14 19:32
vbextreme
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.
aaa