RISOLTO [C] Esercizio gestione biblioteca

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.
ok se uso questo
Codice:
fd=fopen("Richieste.txt","r");

char buf[30];
// legge le righe in un buffer temporaneo
for (int i = 0; i < 4; ++i)
    fgets(buf, 30, fd);

// buf contiene "titolo: TitoloLibro"
// prendiamo solo "TitoloLibro"
sscanf(buf, "%*s %s", titolo);

ricerca(lista,titolo);
lista = cancellalibri(lista, titolo);
fclose(fd);
non posso mettere un ciclo che mi permette di eseguirle tutte?
--- i due messaggi sono stati uniti ---
ok se uso questo
Codice:
fd=fopen("Richieste.txt","r");

char buf[30];
// legge le righe in un buffer temporaneo
for (int i = 0; i < 4; ++i)
    fgets(buf, 30, fd);

// buf contiene "titolo: TitoloLibro"
// prendiamo solo "TitoloLibro"
sscanf(buf, "%*s %s", titolo);

ricerca(lista,titolo);
lista = cancellalibri(lista, titolo);
fclose(fd);
non posso mettere un ciclo che mi permette di eseguirle tutte?per il resto ci sono errori?
 
Ultima modifica:
Sì, puoi fare una cosa tipo
Codice:
while (!feof(fd)) {
    // resetta 'titolo', serve per non considerare il valore letto precedentemente
    titolo[0] = '\0';

    // legge le righe in un buffer temporaneo
    for (int i = 0; i < 4; ++i)
        fgets(buf, 30, fd); 

    // buf contiene "titolo: TitoloLibro"
    // prendiamo solo "TitoloLibro"
    sscanf(buf, "%*s %s", titolo);

    ricerca(lista,titolo); // e' inutile
    if (strcmp(titolo, "") != 0)
        lista = cancellalibri(lista, titolo);

    // legge le righe in un buffer temporaneo
    // per saltare le righe da 'autore' in poi
    for (int i = 0; i < 3; ++i)
        fgets(buf, 30, fd);
}
Non è il massimo dell'eleganza, anche perché, se devi prelevare solo il titolo dal file, c'era bisogno di salvare anche le altre informazioni? A sto punto salvavi solo i titoli, oppure prelevi anche le altre info e le memorizzi in una struct. Come vuoi. Comunque, non ti serve chiamare la funzione di ricerca, puoi chiamare direttamente cancellalibri: se il titolo non è presente non succede nulla. Ho aggiunto il controllo che se la stringa contenente il titolo è vuota, allora non chiami la funzione di cancellazione.
 
per far si che il programma termina se tutte le richieste sono effettuate basta mettere una return giusto?
 
per far si che il programma termina se tutte le richieste sono effettuate basta mettere una return giusto?
Dove dici?

Comunque, a proposito di migliorie nel tuo codice, metterei al primo posto la formattazione e l'indentazione. Sembra una cosa secondaria ma in realtà è fondamentale per avere una buona leggibilità del codice (non tanto a te che ne sei l'autrice, ma agli altri), ed è indice di professionalità (anche l'occhio vuole la sua parte). Quindi, se è un esercizio che devi consegnare, è un aspetto che ti suggerisco di curare.
In secondo luogo, come ti ho già detto, non serve inserire la dimensione di un array nella lista dei parametri delle funzioni. Perciò (prendo un esempio a caso) void ricerca (struct libri *l,char titolo[MAXTITOLO]), non serve mettere MAXTITOLO, il modo corretto è char titolo[] oppure char *titolo. Scegli una delle due e usa sempre quella (per uniformità).
Altra cosa, visto che hai dichiarato l'alias list per struct libri*, puoi sostituire nel codice tutte le occorrenze del secondo col primo.
Poi nella funzione scriviLista() hai racchiuso la printf tra due parentesi graffe, non serve.
Ti suggerisco infine di eliminare eventuali variabili non utilizzate, le puoi scovare manualmente o, meglio, attivando i warning del compilatore. Su gcc si usa l'opzione -Wall
 
Ultima modifica:
va bene allora domani faccio tutte le modifiche che mi hai suggerito di fare....grazie mille :)
 
Altra cosa che puoi fare è modificare tutte le scanf in modo da 1) consentire l'uso degli spazi e 2) fissare un limite sulla lunghezza massima in modo da evitare buffer overflow. Ti faccio un esempio:
Codice:
#include <stdio.h>

int main()
{
    char a[11];
    
    // legge max 10 caratteri fino a newline, spazi compresi
    scanf("%10[^\n]", a);
    
    printf("%s", a);

    return 0;
}
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top