[C] Selezionare e leggere una determinata riga di un file di

di il
6 risposte

[C] Selezionare e leggere una determinata riga di un file di

Salve a tutti, vorrei rivolgervi un piccolo quesito. Io ho questo file:
Auto1
50
auto2
74
auto3
54
auto4
89
auto5
51
auto6
80
auto7
90
auto8
94
auto9
65
auto10
70
auto11
85
auto12
68
Il mio problema è leggere la prima riga ed inserire il nome e la velocità all'interno di due variabili, per poi fare lo stesso con tutti gli altri elementi. Ciò che non so come fare è il far capire al mio programma come leggere solo la prima riga al primo passaggio e successivamente, al secondo passaggio, come partire dalla seconda riga fino alla fine del file. Spero voi mi possiate dare una mano.
Il codice che ho scritto è il seguente:

#include <stdio.h>
#include <malloc.h>


typedef struct elemento{
	char nome[20];
	int v_media;
	struct elemento *next;
}elemento;

struct elemento *crea_lista()
{
   elemento *p, *punt;
   int i;//indice del ciclo
   int n = 24;//numero elementi che si intende inserire
   p=NULL;
   p = (struct elemento *)malloc(sizeof(struct elemento));
   FILE *catalogo= fopen("elenco_auto.txt","r");
   fscanf(catalogo, "%s", p->nome);
   fscanf(catalogo, "%d", &p->v_media);
   punt = p;
   for(i=3; i<=n; i++)
   {
	   punt->next = (struct elemento *)malloc(sizeof(struct elemento));
       punt = punt->next;
       fscanf(catalogo, "%s", punt->nome);
       fscanf(catalogo, "%d", &punt->v_media);
   } // chiudo il for
   punt->next = NULL; // marcatore fine lista
   fclose(catalogo);
   return(p);
}

void visualizza_lista(struct elemento *p)
{
   printf("lista -> ");

   /* ciclo di scansione */
   while(p != NULL)
   {
      printf("%s", p->nome); // visualizza l’informazione
      printf("%d", p->v_media); // visualizza l’informazione
      printf(" -> ");
      p = p->next; // scorre di un elemento
   }
   printf("NULL");
}

int main()
{
   struct elemento *lista; // puntatore della lista
   lista = crea_lista(); // crea la lista
   visualizza_lista(lista); // stampa la lista
   return 0;
}

Visualizza lista semplicemente mi scrive cosa contiene la lista che ho creato. Ma l'output che ricevo è il seguente:
lista -> (f792094066 -> (f1868852841 -> (f1766203502 -> (f1852397404 -> (f1953724755 -> (f2003783795 -> (f1852789596 -> (f1176530273 -> (f1936876915 -> (f1131308400 -> (f1096577906 -> (f1480928827 -> (f1213421358 -> (f1397966147 -> (f1229343060 -> (f741810279 -> (f1330860869 -> 0ef1631874401 -> 0 -> 0 -> 0 -> 0 -> 0 -> NULL
Spero che possiate aiutarmi a capire l'errore.
Grazie in anticipo e buona giornata.

6 Risposte

  • Re: [C] Selezionare e leggere una determinata riga di un file di

    Ciao, dal codice che hai scritto mi sembra che tu non abbia ancora ben chiari (o forse ancora devi studiarli) i vari metodi che riguardano l'inserimento in lista.
    Ci sono principalmente due metodi:
    1 - Il primo consiste nell'inserimento dei nodi in TESTA, cioè inserisco il primo nodo, poi il secondo, però il secondo lo inserisco in testa, quindi risulterà essere un nuovo primo nodo ecc... (Devi vederlo com se fosse una pila di libri che cade, il primo a cadere è proprio quello che poi diventerà l'ultimo, no? );
    2 - Il secondo metodo consiste nell'inserimento in CODA, cioè quello consueto, quindi l'ultimo nodo che inserisco è proprio l'ultimo, il primo resta il primo, ecc...

    Ora, per quanto riguarda la stampa, la funzione è corretta e resta uguale sia per l'inserimento in coda, che per quello in testa. Per quanto riguarda la funzione crea_lista, invece, ci sono un bel po' di incongruenze ed errori logici, ma questo puoi leggerlo nel codice:
    (Ho usato un inserimento in TESTA, perchè è il più facile da scrivere, e non volevo confonderti le idee con quello in coda)
    #include <stdio.h>
    /* Includere malloc.h non serve a molto, meglio usare la libreria standard */
    #include <stdlib.h>
    
    typedef struct elemento {
    	char nome[20];
    	int v_media;
    	struct elemento *next;
    }TipoElem; /* Meglio dare un nome diverso al tipo */
    
    typedef TipoElem * TipoLista; /* Questo serve per definire il tipo della lista 
                                   (per non commettere errori logici ecc...) e per
    							   rendere il codice un po' più semplice da capire */
    
    
    TipoLista crea_lista (){
      /* Questa funzione usa l'inserimento IN TESTA */
       TipoLista listaAuto = NULL;
       TipoElem *nuovo; /* Serve per creare sempre un nuovo nodo */
       
       FILE *catalogo = fopen ("elenco_auto.txt", "r");
       if (!catalogo)
         printf ("Errore in apertura file!");
         
       else {
         /* Se il file non è vuoto inizio ad aggiungere le auto,
    	    fino a quando non arrivo alla fine del file (EOF),
    		in pratica così il programma legge qualsiasi file
    		formattato in questo modo e non serve sapere il numero
    		di elementi contenuti... */
         while (!feof(catalogo)){
           nuovo = malloc (sizeof(TipoElem)); /* Alloco il nuovo elemento */
           fscanf (catalogo ,"%s\n%d", nuovo->nome, &nuovo->v_media);
    	   nuovo->next = listaAuto; /* Assegno il nodo successivo a questo come l'inizio della "vecchia" lista */
           listaAuto = nuovo; /* E poi assesto la lista sul primo vero nodo, che ora è diventato
    	   proprio questo! Ecco l'inserimento in testa... */
         }
    
        } 
    
    return listaAuto;
    }
    
    void visualizza_lista(TipoLista p)
    {
    	/* Per stampare la lista*/
       printf("lista: \n -> ");
       
       /* Stampo la lista, però al contrario */
       while(p)
       {
       	/* Ho modificato qualcosa per ordinare la stampa */
          printf("%s", p->nome);
          printf(": %d\n", p->v_media);
          printf(" -> ");
          p = p->next;
       }
       printf("NULL");
       return; /* Il return non dimenticarlo mai... */
    }
    
    
    int main()
    {  /* Qualche piccolo aggiustamento */
       TipoLista lista;
       lista = crea_lista();
       visualizza_lista(lista);
       
       printf ("\n\nFine, ");
       system ("PAUSE");
       return 0;
    }
    
    Come vedi ho fatto un po' di correzioni e ho messo un po' d'ordine, ma se non hai ancora studiato gli inserimenti puoi stare tranquillo, perchè se ora ti risulta un po' estraneo, tra un po' scoprirai che alla fine le liste sono molto facili da gestire. Buona programmazione
  • Re: [C] Selezionare e leggere una determinata riga di un file di

    Guarda non so come ringraziarti adesso lo provo e poi se ho qualche dubbio non esiterò a chiedertelo.
    grazie mille
  • Re: [C] Selezionare e leggere una determinata riga di un file di

    Dopo aver fatto "run" mi scrive "premere un tasto per continuare" e poi mi stampa una lista vuota.Potresti dirmi cosa devo fare.grazie e scusa ancora
    questo è quello che mi stampa:
    Premere un tasto per continuare . . .

    Errore in apertura file!lista:
    -> NULL

    Fine,
  • Re: [C] Selezionare e leggere una determinata riga di un file di

    Ciao, il "premere un tasto per continuare" mi sembra molto strano come output, perchè (se hai utilizzato il mio codice) ho messo soltanto un system("PAUSE"), ma alla fine del programma, quindi al massimo dovrebbe presentarsi dopo l'errore in apertura... Comunque, il problema sta tutto nell'apertura del file, in pratica il programma non trova il file, le opzioni sono quindi soltanto queste due:

    1 - Il file si trova nella stessa cartella dell'eseguibile? Se no, devi spostarlo nella STESSA cartella;
    2 - Il file si chiama "elenco_auto.txt"? Se no, devi rinominarlo oppure cambia il nome nel comando fopen con quello da te creato.

    EDIT: Confermo che il "premere un tasto per continuare" all'inizio è MOLTO strano , questo sempre se hai usato il mio codice senza modificarlo, perchè l'ho compilato ora e in effetti se non riesce ad aprire il file l'output è ben diverso:
    Errore in apertura file!lista:
    -> NULL
    Fine, Premere un tasto per continuare...
    Comunque non è quello il problema, le opzioni restano quelle due
  • Re: [C] Selezionare e leggere una determinata riga di un file di

    Ho fatto come dicevi tu e infatti non avevo inserito il file nella cartella dell'eseguibile. Ho provato anche il codice che avevo scritto prima con il file all'interno dell'eseguibile e vanno bene entrambi adesso. Non so veramente come ringraziarti grazie mille!!!
  • Re: [C] Selezionare e leggere una determinata riga di un file di

    Sono contento di averti aiutato, buon proseguimento
Devi accedere o registrarti per scrivere nel forum
6 risposte