Oppure

Loading
02/05/20 9:08
sara987
void StampaListaToFile(list lista, FILE *fpr){
while(lista != NULL){
fprintf(fpr, "%s %s %d %d \n", lista->titolo, lista->nome_autori, lista->codice_identificativo, lista->status);
lista = lista->next;
}
}

no non va bene perché ho la lista cosi
Ultima modifica effettuata da sara987 02/05/20 9:09
02/05/20 9:12
DI NUOVO CON LA LISTA?

E questa volta scrivi (non leggi) la lista NEL FILE?

Tutto l'opposto di quello che hai detto 1 minuto fa.




Va beh non ho tempo da perdere... auguri
02/05/20 15:21
AldoBaldo
Sara, è più facile di quel che sembra, solo che poni le questioni in modo molto confuso (probabilmente perché non hai ben chiaro dove vuoi arrivare).

Hai un codice che legge iterativamente una riga del file alla volta, e se non comincia con '#' la visualizza in console.

Vuoi trasformare quel codice in modo che impieghi una soluzione ricorsiva anziché quella iterativa.

Dunque, dovrai "isolare" il codice di lettura e stampa in una funzione a parte, che dovrà essere strutturata in modo da chiamare se stessa fino al raggiungimento di una certa condizione. Quando quella condizione verrà raggiunta, le funzioni dovranno "chiudersi" una ad una, ritornando al "livello" precedente.

Tante volte una funzione ricorsiva usa un parametro passato per indirizzo, oppure il valore di ritorno, per definire il momento in cui cominciare a "chiudere" una ad una le funzioni già chiamate, ma nel tuo caso non è necessario.

Prova a impostare una funzione (che so... il prototipo potrebbe essere void mostra_libreria(FILE *f); ) che legga dal file e mandi in console UNA SOLA riga. Per come funziona fgets() quando usato per leggere dallo stream abbinato a un file, ad ogni chiamata la lettura riprende dal punto in cui si era interrotta con la chiamata precedente, per cui non ti serve tenere contatori, indici o chissà che altro -- fa tutto lei.

La funzione mostra_libreria() ha le sue variabili locali res e libreria e le usa per chiamare fgets().
Se fgets() restituisce un puntatore che NON è NULL significa che la chiamata è riuscita, e allora mostri la riga in console, se non comincia con '#', e chiami nuovamente mostra_libreria.
Se fgets() restituisce NULL, significa che la chiamata non è riuscita (probabilmente perché sei in fondo al file e hai già letto tutto), e allora lasci che la funzione "ritorni". Tutto qui.

In main(), ti limiti ad aprire il file, verificare che sia stato effettivamente aperto, chiamare mostra_libreria(), chiudere il file, restituire 0. Fatto.

Se segui l'esecuzione in un debugger, vedi che verranno "aperte" (invocate, chiamate) una dopo l'altra tante istanze della funzione mostra_libreria() quante sono le righe del file. Ogni istanza della funzione avrà la sua dotazione di variabili locali indipendenti. Quando arriverai in fondo al file, le istanze verrano "chiuse" una ad una, all'indietro, come se tu stessi riavvolgendo il nastro di un registratore di quelli di una volta.

Prova! :k:
Ultima modifica effettuata da AldoBaldo 02/05/20 15:22
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
02/05/20 15:46
sara987
Postato originariamente da AldoBaldo:
Sara, è più facile di quel che sembra, solo che poni le questioni in modo molto confuso (probabilmente perché non hai ben chiaro dove vuoi arrivare).

Hai un codice che legge iterativamente una riga del file alla volta, e se non comincia con '#' la visualizza in console.

Vuoi trasformare quel codice in modo che impieghi una soluzione ricorsiva anziché quella iterativa.

Dunque, dovrai "isolare" il codice di lettura e stampa in una funzione a parte, che dovrà essere strutturata in modo da chiamare se stessa fino al raggiungimento di una certa condizione. Quando quella condizione verrà raggiunta, le funzioni dovranno "chiudersi" una ad una, ritornando al "livello" precedente.

Tante volte una funzione ricorsiva usa un parametro passato per indirizzo, oppure il valore di ritorno, per definire il momento in cui cominciare a "chiudere" una ad una le funzioni già chiamate, ma nel tuo caso non è necessario.

Prova a impostare una funzione (che so... il prototipo potrebbe essere void mostra_libreria(FILE *f); ) che legga dal file e mandi in console UNA SOLA riga. Per come funziona fgets() quando usato per leggere dallo stream abbinato a un file, ad ogni chiamata la lettura riprende dal punto in cui si era interrotta con la chiamata precedente, per cui non ti serve tenere contatori, indici o chissà che altro -- fa tutto lei.

La funzione mostra_libreria() ha le sue variabili locali res e libreria e le usa per chiamare fgets().
Se fgets() restituisce un puntatore che NON è NULL significa che la chiamata è riuscita, e allora mostri la riga in console, se non comincia con '#', e chiami nuovamente mostra_libreria.
Se fgets() restituisce NULL, significa che la chiamata non è riuscita (probabilmente perché sei in fondo al file e hai già letto tutto), e allora lasci che la funzione "ritorni". Tutto qui.

In main(), ti limiti ad aprire il file, verificare che sia stato effettivamente aperto, chiamare mostra_libreria(), chiudere il file, restituire 0. Fatto.

Se segui l'esecuzione in un debugger, vedi che verranno "aperte" (invocate, chiamate) una dopo l'altra tante istanze della funzione mostra_libreria() quante sono le righe del file. Ogni istanza della funzione avrà la sua dotazione di variabili locali indipendenti. Quando arriverai in fondo al file, le istanze verrano "chiuse" una ad una, all'indietro, come se tu stessi riavvolgendo il nastro di un registratore di quelli di una volta.

Prova! :k:

tipo cosi
void mostra_libreria(FILE *f){
char res;
char libreria[15];
FILE *fd;

if( fd == NULL ) {
return NULL;
}
else {
fd=fopen("listaLibri.txt", "r";);
}
}

02/05/20 16:04
Spero per te che tu non debba sostenere un esame universitario, neanche di fondamenti di informatica.
Ultima modifica effettuata da 02/05/20 16:06
02/05/20 18:44
AldoBaldo
Ma no! :) Sei MOLTO fuori strada.

Intanto, se passi f, usa f, non fd. NON dichiarare un fd che neppure inizializzi prima di usarlo in una verifica (fd == NULL). E poi cosa restituisci NULL se la funzione è dichiarata in modo da restituire void (cioè niente)? E poi ancora, perché apri di nuovo il file, se si suppone che tu lo abbia già aperto in main() per poi passare tramite f il puntatore ottenuto?

L'impressione che si ricava è che tu stia andando a caso sperando di "azzeccarci". Non c'è niente di male nel procedere per prove ed errori, però non "tirando a indovinare": le probabilità di incappare in una soluzione funzionante sono davvero esigue, direi quasi nulle.

Per sapere di cosa stiamo parlando: cosa hai già imparato a usare, con un ragionevole grado di sicurezza?
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.