titolo, song->compositore); while (!feof(f)) { if (strcmp(comp, song->compositore) == 0) { printf("%s %s\n", song->titolo, song->compositore); } fscanf(f, "%s %s", song->titolo, song->compositore); } free(song); fclose(f); } void inserisci_canzone() { FILE *f; if ((f = fopen("synthpop80s.txt", "r")) == NULL) { printf("Il file non può essere aperto"> titolo, song->compositore); while (!feof(f)) { if (strcmp(comp, song->compositore) == 0) { printf("%s %s\n", song->titolo, song->compositore); } fscanf(f, "%s %s", song->titolo, song->compositore); } free(song); fclose(f); } void inserisci_canzone() { FILE *f; if ((f = fopen("synthpop80s.txt", "r")) == NULL) { printf("Il file non può essere aperto"> titolo, song->compositore); while (!feof(f)) { if (strcmp(comp, song->compositore) == 0) { printf("%s %s\n", song->titolo, song->compositore); } fscanf(f, "%s %s", song->titolo, song->compositore); } free(song); fclose(f); } void inserisci_canzone() { FILE *f; if ((f = fopen("synthpop80s.txt", "r")) == NULL) { printf("Il file non può essere aperto">

Problema

WOLD, una stazione radio locale, vuole costruire un database di canzoni, per automatizzare le ricerche

Si è creato un file in cui sono stati inseriti degli elementi composti dai titoli e dai compositori delle canzoni

Si intende dare al disk-jockey la possibilità di:

https://open.spotify.com/playlist/0xPxmDL8XvmZlDZYQ1yEBg?si=4e75569d538d40f7

Basi-di-Dati/1. file processing/database di canzoni at main · rarissimaavis/Basi-di-Dati

//db.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "db.h"
#define MAX_LEN 30

struct canzone
{
    char titolo[MAX_LEN+1];
    char compositore[MAX_LEN+1];
};

void cerca_compositore()
{
    FILE *f;
    if ((f = fopen("synthpop80s.txt", "r")) == NULL)
    {
        printf("Il file non può essere aperto");
        exit(-1);
    }

    printf("1. Ricerca per compositore\\nInserisci il nome del compositore cercato: ");
    char comp[MAX_LEN+1];
    scanf("%s", comp);

    canzone song = malloc(sizeof(*song));
    fscanf(f, "%s %s", song->titolo, song->compositore);
    while (!feof(f))
    {
        if (strcmp(comp, song->compositore) == 0)
        {
            printf("%s %s\\n", song->titolo, song->compositore);
        }
        fscanf(f, "%s %s", song->titolo, song->compositore);
    }
    free(song);
    fclose(f);
}

void inserisci_canzone()
{
    FILE *f;
    if ((f = fopen("synthpop80s.txt", "r")) == NULL)
    {
        printf("Il file non può essere aperto\\n");
        exit(-1);
    }

    printf("2. Inserimento di una canzone\\nInserisci titolo e compositore: ");
    char titolo[MAX_LEN+1];
    char compositore[MAX_LEN+1];
    scanf("%s %s", titolo, compositore);

    canzone song = malloc(sizeof(*song));
    fscanf(f, "%s %s", song->titolo, song->compositore);
    while (!feof(f))
    {
        if ((strcmp(titolo, song->titolo) == 0) && (strcmp(compositore, song->compositore) == 0))
        {
            printf("Canzone già presente nel database\\n");
            fclose(f);
            return;
        }
        fscanf(f, "%s %s", song->titolo, song->compositore);
    }

    if ((f = fopen("synthpop80s.txt", "a+")) == NULL)
    {
        printf("Il file non può essere aperto\\n");
        exit(-1);
    }
    fprintf(f, "%s %s\\n", titolo, compositore);
    free(song);
    fclose(f);
}

void modifica_compositore()
{
    FILE *f, *f_tmp;
    if ((f = fopen("synthpop80s.txt", "r")) == NULL)
    {
        printf("Il file non può essere aperto\\n");
        exit(-1);
    }
    if ((f_tmp = fopen("tmp.txt", "w")) == NULL)
    {
        printf("Il file non può essere creato/aperto\\n");
        exit(-1);
    }

    printf("3. Modifica compositore\\nInserisci il nome del compositore da modificare: ");
    char comp[MAX_LEN+1];
    scanf("%s", comp);
    printf("Inserisci il nuovo nome: ");
    char comp_modificato[MAX_LEN+1];
    scanf("%s", comp_modificato);

    canzone song = malloc(sizeof(*song));
    fscanf(f, "%s %s", song->titolo, song->compositore);
    while (!feof(f))
    {
        if (strcmp(comp, song->compositore) == 0)
        {
            fprintf(f_tmp, "%s %s\\n", song->titolo, comp_modificato);
        }
        else
        {
            fprintf(f_tmp, "%s %s\\n", song->titolo, song->compositore);
        }
        fscanf(f, "%s %s", song->titolo, song->compositore);
    }
    free(song);
    fclose(f);
    fclose(f_tmp);
    remove("synthpop80s.txt");
    rename("tmp.txt", "synthpop80s.txt");
}

void cancella_compositore()
{
    FILE *f, *f_tmp;
    if ((f = fopen("synthpop80s.txt", "r")) == NULL)
    {
        printf("Il file non può essere aperto\\n");
        exit(-1);
    }
    if ((f_tmp = fopen("tmp.txt", "w")) == NULL)
    {
        printf("Il file non può essere creato/aperto\\n");
        exit(-1);
    }

    printf("4. Cancella compositore\\nInserisci il nome del compositore da cancellare: ");
    char comp[MAX_LEN+1];
    scanf("%s", comp);

    canzone song = malloc(sizeof(*song));
    fscanf(f, "%s %s", song->titolo, song->compositore);
    while (!feof(f))
    {
        if (strcmp(comp, song->compositore) != 0)
        {
            fprintf(f_tmp, "%s %s\\n", song->titolo, song->compositore);
        }
        fscanf(f, "%s %s", song->titolo, song->compositore);
    }
    free(song);
    fclose(f);
    fclose(f_tmp);
    remove("synthpop80s.txt");
    rename("tmp.txt", "synthpop80s.txt");
}
//dj.c

#include <stdio.h>
#include <stdlib.h>
#include "db.h"

int main(void)
{
    int a;
    do
    {
        printf("1. cerca per compositore\\n2. inserisci canzone\\n3. modifica compositore\\n4. cancella compositore\\n(0 per uscire)\\n");
        printf("Seleziona un'opzione: ");
        scanf("%d", &a);
        switch(a)
        {
            case 0:
                a = 0;
                break;
            case 1:
                cerca_compositore();
                break;
            case 2:
                inserisci_canzone();
                break;
            case 3:
                modifica_compositore();
                break;
            case 4:
                cancella_compositore();
                break;
        }

    } while (a != 0);
    return 0;
}