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!