RISOLTO [C] Esercizio gestione biblioteca

Stato
Discussione chiusa ad ulteriori risposte.

sare1234

Utente Attivo
190
1
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?
Post automatically merged:

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:

fabio93

Utente Attivo
606
173
CPU
AMD Ryzen 5 2400G
Dissipatore
Arctic Alpine64 Plus
Scheda Madre
Gigabyte GA-AX370-Gaming 3
HDD
Crucial MX500 250 GB, Crucial BX500 240 GB
RAM
G.Skill F4-3200C14D-16GFX FlareX 16 GB
Monitor
HP 2010i
PSU
Corsair TX550M
Case
Sharkoon M25-W
Periferiche
Magicforce 68, Logitech G203
OS
Windows 10 Pro, Fedora 31
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.
 

sare1234

Utente Attivo
190
1
per far si che il programma termina se tutte le richieste sono effettuate basta mettere una return giusto?
 

fabio93

Utente Attivo
606
173
CPU
AMD Ryzen 5 2400G
Dissipatore
Arctic Alpine64 Plus
Scheda Madre
Gigabyte GA-AX370-Gaming 3
HDD
Crucial MX500 250 GB, Crucial BX500 240 GB
RAM
G.Skill F4-3200C14D-16GFX FlareX 16 GB
Monitor
HP 2010i
PSU
Corsair TX550M
Case
Sharkoon M25-W
Periferiche
Magicforce 68, Logitech G203
OS
Windows 10 Pro, Fedora 31
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:

fabio93

Utente Attivo
606
173
CPU
AMD Ryzen 5 2400G
Dissipatore
Arctic Alpine64 Plus
Scheda Madre
Gigabyte GA-AX370-Gaming 3
HDD
Crucial MX500 250 GB, Crucial BX500 240 GB
RAM
G.Skill F4-3200C14D-16GFX FlareX 16 GB
Monitor
HP 2010i
PSU
Corsair TX550M
Case
Sharkoon M25-W
Periferiche
Magicforce 68, Logitech G203
OS
Windows 10 Pro, Fedora 31
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.

Entra

oppure Accedi utilizzando

Hot: Quale crypto per il futuro?

  • Bitcoin

    Voti: 122 45.7%
  • Ethereum

    Voti: 109 40.8%
  • Cardano

    Voti: 40 15.0%
  • Polkadot

    Voti: 14 5.2%
  • Monero

    Voti: 17 6.4%
  • XRP

    Voti: 26 9.7%
  • Uniswap

    Voti: 7 2.6%
  • Litecoin

    Voti: 16 6.0%
  • Stellar

    Voti: 16 6.0%
  • Altro (Specifica)

    Voti: 40 15.0%

Discussioni Simili