PDA

Visualizza la versione completa : [C] Selezionare e leggere una determinata riga di un file di testo


Alessio Mariani
06-08-2014, 18:56
Buonasera, vorrei rivolgervi un piccolo quesito. Io ho questo file:

Auto1 75
Auto2 100
Auto3 80
Auto4 65
Auto5 85
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.
Grazie in anticipo e buona giornata.

paolino_delta_t
06-08-2014, 21:35
Non devi fare niente. Ad ogni operazione di I/O su file viene spostato il cursore sul file. Se leggi la prima riga, il cursore viene posizionato alla fine di questa. La successiva lettura leggerà la seconda riga. E così via.

Questo sempre che tu non chiuda il file.

Alessio Mariani
07-08-2014, 18:44
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 = 12;//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, "%i", &p->v_media);
/*scanf("%s", p->nome);
scanf("%i", & 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, "%i", &punt->v_media);
/*scanf("%s", punt->nome);
scanf("%i", &punt->v_media);*/
} // chiudo il for
punt->next = NULL; // marcatore fine lista
fclose(catalogo);
return(p);
}

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 —> (i792094066 —> (i1868852841 —> (i1766203502 —> (i1852397404 —> (i1953724755 —> (i2003783795 —> (i1852789596 —> (i1176530273 —> (i1936876915 —> (i1131308400 —> (i1096577906 —> NULL
Invece dovrebbe essere lista -> nome1 -> 65 -> nome2 -> 75... ecc.
Sapresti dirmi cosa sbaglio? :(

oregon
07-08-2014, 18:46
Ma il codice della visualizza_lista qual è ?

Alessio Mariani
07-08-2014, 18:52
Scusa l'avevo dimenticato.




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


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

oregon
07-08-2014, 19:09
Al posto di %i usa %d (almeno per il numero l'errore è quello ...)


P.S. Usa i tag CODE per il codice non QUOTE

Alessio Mariani
07-08-2014, 21:03
Ho provato con %d ma mi da sempre lo stesso output:(. Non capisco davvero dove ho sbagliato.

oregon
07-08-2014, 22:29
Utilizza %d anche nella fscanf

Alessio Mariani
08-08-2014, 13:41
#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 = 12;//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;
}



Ho provato anche con %d ma non cambia nulla :(

LeleFT
08-08-2014, 13:45
@Alessio Mariani
te l'ha già detto oregon e te lo ripeto anch'io: quando posti del codice devi usare i tag CODE non i tag QUOTE (che servono per fare citazioni) come hai fatto finora.

Ho sistemato io tutti i tuoi post.


Ciao. :ciauz:

Loading