PDA

Visualizza la versione completa : Problema con una funzione "SORGENTE IN C"


fabrymus
09-02-2015, 17:10
Salve a tutti, sto sviluppando un semplice programma, un roster di piloti ho un problema nella funzione LEGGIFILE, una volta salvato il file esco dal programma poi lo riapro gli faccio leggere il file e lui mi genera una lista che quando vado a visualizzarla il primo pilota è l'ultimo che c'era nel file quindi alla rovescia.
Ho fatto tantissime prove senza realizzare nulla, vorrei che per come il roster venga salvato me lo deve visualizzare quindi nello stesso ordine.

Grazie in anticipo per la disponibilità.

Di seguito riporto il codice della funzione




struct elemento *LeggiFile(struct elemento *p)
{
struct Pilota DaInserire;
struct elemento *punt;
struct Pilota vuoto;
int scelta;


printf("Leggere il roster di default?? 1 (si), 0 (no) ----> ");
scanf("%d", &scelta);

if(scelta == 0)
return;

FILE *stream = fopen("roster.txt", "r");
if (stream == NULL)
{
printf("\n\n********************************************** *******************************\n");
printf("ERRORE NELLA LETTURA DEL ROSTER, POTREBBE NON ESISTERE O ESSERE VUOTO\n\n");
printf("************************************************** ***************************\n");
return 0;
}

while (!feof(stream))
{
fscanf(stream, "%s\t%s\t%s\t%s\t%s\t%s\n\n", DaInserire.callsign, DaInserire.nome, DaInserire.status, DaInserire.grado, DaInserire.squadriglia, DaInserire.ruolo);

punt = (struct elemento *)malloc(sizeof(struct elemento));
punt->inf = DaInserire;
punt->succ = p;
p = punt;
DaInserire = vuoto;


}




fflush(stream);
fclose(stream);

printf("\n\n************@@@@@@@@@@@@@@@@@@@@@@@@@********* ***\n");
printf("************ ************\n");
printf("************ROSTER LETTO CON SUCCESSO************\n");
printf("************ ************\n");
printf("************@@@@@@@@@@@@@@@@@@@@@@@@@************\ n");


return (punt);
}


Se avete bisogno del sorgente completo lo pubblico.

Samuele_70
09-02-2015, 19:33
Alloca il nuovo elemento in coda anziché in testa come fai ora.

fabrymus
09-02-2015, 21:10
È proprio questo il mio problema.. Dovrei usare un puntatore ausiliario?? Se sì come lo inizializzo?

Samuele_70
09-02-2015, 21:23
Crei il primo elemento e gli assegni DaInserire
poi assegni i successivi elementi a p->succ
ti sposti su p->succ continui.
assegni NULL all'ultimo ed hai fatto.

Una domanda, perché passi struct elemento alla funzione ? la lista potrebbe non essere vuota ?
Se la lista deve essere comunque vuota (NULL) il parametro è inutile, è sufficente che restituisca il primo elemento della lista che crei.

fabrymus
09-02-2015, 21:41
a

fabrymus
09-02-2015, 21:46
si la lista potrebbe non essere vuota in tal caso avrei dei problemi..comunque riguardo a ciò che mi hai consigliato ho incominciato da poco con le liste e ho un pò di difficoltà ancora a capire il meccanismo quindi come creo il primo elemento dentro il ciclo? e successivamente a p->succ come gli assegno i successivi elementi?

Samuele_70
09-02-2015, 23:22
Prima fase:
Se p è NULL (la lista è vuota) crei il primo elemento e gli assegni la prima riga del file
Invece se p non è NULL (la lista non è vuota) scorri tutta la lista fino alla fine.

Seconda fase:
crei ogni nuovo nodo in coda punt->succ = (struct elemento *)malloc(sizeof(struct elemento)); e gli assegni le stringhe della riga corrente. continui fino alla fine del file, in fondo non cambia poi molto rispetto codice che hai già creato.

Per semplicità ti consiglierei di usare una funzione che crea un nuovo nodo elemento, legge le stringhe dal file aperto e glieli assegna, per poi restituire il puntatore. :)

esempio


struct elemento *readLine( FILE *stream )
{

fabrymus
10-02-2015, 11:30
Si la funzione che mi crea il nodo magari la farò dopo che risolverò questo problema..comunque ho fatto come mi hai detto (non so se ho scritto il sorgente esatto) ma ancora non funziona sicuramente sbaglio a scrivere qualcosa!!!:confused::)

SORGENTE:



FILE *stream = fopen("roster.txt", "r");

if (p == NULL)
{
fscanf(stream, "%s\t%s\t%s\t%s\t%s\t%s\n\n", DaInserire.callsign, DaInserire.nome, DaInserire.status, DaInserire.grado, DaInserire.squadriglia, DaInserire.ruolo);
punt = (struct elemento *)malloc(sizeof(struct elemento));
punt->inf = DaInserire;
punt->succ = NULL;
DaInserire = vuoto;
}

if (p != NULL)
{
p = p->succ;
}


while (!feof(stream))
{
fscanf(stream, "%s\t%s\t%s\t%s\t%s\t%s\n\n", DaInserire.callsign, DaInserire.nome, DaInserire.status, DaInserire.grado, DaInserire.squadriglia, DaInserire.ruolo);

punt->succ = (struct elemento *)malloc(sizeof(struct elemento));
punt->inf = DaInserire;
p = punt;
DaInserire = vuoto;


}

Samuele_70
10-02-2015, 13:36
Si la funzione che mi crea il nodo magari la farò dopo che risolverò questo problema..comunque ho fatto come mi hai detto (non so se ho scritto il sorgente esatto) ma ancora non funziona sicuramente sbaglio a scrivere qualcosa!!!:confused::)

SORGENTE:



FILE *stream = fopen("roster.txt", "r");

if (p == NULL)
{
fscanf(stream, "%s\t%s\t%s\t%s\t%s\t%s\n\n", DaInserire.callsign, DaInserire.nome, DaInserire.status, DaInserire.grado, DaInserire.squadriglia, DaInserire.ruolo);


p= (struct elemento *)malloc(sizeof(struct elemento));
punt = p;


punt->inf = DaInserire;
punt->succ = NULL;
DaInserire = vuoto;
}
else

while( punt->succ ) //...Scorro la lista in cerca dell'ultimo elemento
punt = punt->succ;



while (!feof(stream))
{
fscanf(stream, "%s\t%s\t%s\t%s\t%s\t%s\n\n", DaInserire.callsign, DaInserire.nome, DaInserire.status, DaInserire.grado, DaInserire.squadriglia, DaInserire.ruolo);

punt->succ = (struct elemento *)malloc(sizeof(struct elemento));

punt = punt->succ; // Mi sposto al nodo successivo;

punt->inf = DaInserire;
punt->succ = NULL;

DaInserire = vuoto;

}

return p; // Restituisce il primo elemento della lista



Ho apportato qualche correzione 'al volo', non l'ho provato quindi ci saranno sicuramente degli errori. Ma ti ho evidenziato alcuni problemi.

fabrymus
10-02-2015, 13:50
Grazie infinite il codice funziona i miei errori in pratica erano nel while che avevo provato anche io solo che mi spostavo erroneamente fin quando p era != da NULL il che è sbagliato perchè si ferma a NULL e non all'ultimo elemento.

Grazie del supporto sei grande :ciauz:.

Loading