Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - file
Forum - C/C++ - file - Pagina 3

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6080
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 11:12
Sabato, 02/05/2020
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


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à.
PM Quote
Avatar
AldoBaldo (Member)
Expert


Messaggi: 551
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 17:21
Sabato, 02/05/2020
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 il 02/05/2020 alle 17: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.
PM Quote
Avatar
sara987 (Normal User)
Newbie


Messaggi: 11
Iscritto: 02/05/2020

Segnala al moderatore
Postato alle 17:46
Sabato, 02/05/2020
Testo quotato

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


PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6080
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 18:04
Sabato, 02/05/2020
Spero per te che tu non debba sostenere un esame universitario, neanche di fondamenti di informatica.

Ultima modifica effettuata da nessuno il 02/05/2020 alle 18:06


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à.
PM Quote
Avatar
AldoBaldo (Member)
Expert


Messaggi: 551
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 20:44
Sabato, 02/05/2020
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.
PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo