Ciao a tutti programmatori, come dal titolo ho un piccolo problema con la gestione dei file in C.
In sostanza devo caricare un file .txt contenenti dei brani musicali. Vi Scrivo il file così che possiate comprendere meglio:
es. file:
prima riga: titolo brano musicale
seconda riga: nome cantante
terza riga: genere musicale
quarta riga: anno, durata brano;
Problema: Per esempio tra le granite e la granate ci stanno degli spazi a dividere le parole del titolo giusto? ecco... proprio questo è il problema, se metto gli spazi al posto di caricarmi il numero effettivo dei brani me ne restituisce di più, invece se metto dei trattani in modo da unire il titolo(es: tra-le-granite-e-le-granate) carica perfettamente. Vi poso sotto la mia soluzione.
il prototipo della funzione per caricare i file è la seguente: int CaricaFile(char *nomefile, TLista *lis);
sotto al file trovate la soluzione. Grazie!
il file è questo:
tra le granite e le granate
francesco gabbani
pop
2017 3:15
partiti adesso
giusy ferreri
pop
2017 2:48
Ragazza-Paradiso
Ermal-Meta
rock
2017 2:52
With or without you
u2
rock
1987 4:56
In sostanza devo caricare un file .txt contenenti dei brani musicali. Vi Scrivo il file così che possiate comprendere meglio:
es. file:
prima riga: titolo brano musicale
seconda riga: nome cantante
terza riga: genere musicale
quarta riga: anno, durata brano;
Problema: Per esempio tra le granite e la granate ci stanno degli spazi a dividere le parole del titolo giusto? ecco... proprio questo è il problema, se metto gli spazi al posto di caricarmi il numero effettivo dei brani me ne restituisce di più, invece se metto dei trattani in modo da unire il titolo(es: tra-le-granite-e-le-granate) carica perfettamente. Vi poso sotto la mia soluzione.
il prototipo della funzione per caricare i file è la seguente: int CaricaFile(char *nomefile, TLista *lis);
sotto al file trovate la soluzione. Grazie!
il file è questo:
tra le granite e le granate
francesco gabbani
pop
2017 3:15
partiti adesso
giusy ferreri
pop
2017 2:48
Ragazza-Paradiso
Ermal-Meta
rock
2017 2:52
With or without you
u2
rock
1987 4:56
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DIM 50
/*STRUTTURE DATI*/
typedef struct BranoMusicale {
char titolo_brano[255];
char nome_cantante[63];
char genere_musicale[15];
int anno;
char durata_brano[DIM];
int minuti, secondi;
}TBranoMusicale;
typedef struct NodoBranoMusicale {
TBranoMusicale info;
struct NodoBranoMusicale *next;
}TNodoBranoMusicale;
typedef TNodoBranoMusicale* TListaBraniMusicali;
typedef struct GenereMusicale {
char genere_musicale[15];
char durata_totale[DIM];
int minuti, secondi;
}TGenereMusicale;
typedef struct NodoGenereMusicale {
TGenereMusicale info;
struct NodoGenereMusicale *next;
}TNodoGenereMusicale;
typedef struct TNodoGenereMusicale* TListaGeneriMusicali;
/*DEFINIZIONE DI FUNZIONE*/
TListaBraniMusicali CreaListaBraniMusicali() {
return NULL;
}
TListaGeneriMusicali CreaListaGeneriMusicali() {
return NULL;
}
//funzione menu principale
int menu() {
int scelta;
printf("---> Menu' Principale <---\n");
printf("-> [1] Carica Brani Musicali\n");
printf("-> [2] Modifica Nome Cantante\n");
printf("-> [3] Elimina Brano\n");
printf("-> [4] Copia Brani In Lista Generi Musicali\n");
printf("-> [5] Stampa Lista(Generi Musicali)\n");
printf("-> [6] Esci Dal Programma\n");
printf("Scelta: ");
scanf("%d", &scelta);
while (scelta < 1 || scelta > 6) {
printf("Scelta non valida!\n");
printf("Scelta: ");
scanf("%d", &scelta);
return scelta;
}
return scelta;
system("PAUSE");
}
void InserisciBraniInListaOrdinata(TListaBraniMusicali *lis, TBranoMusicale elem) {
TListaBraniMusicali prec, curr, newnode;
if ((newnode = (TListaBraniMusicali)malloc(sizeof(TNodoBranoMusicale))) == NULL) {
printf("Errore nell'allocazione della memoria.\n");
exit(1);
}
newnode->info = elem;
prec = NULL;
curr = *lis;
while (curr != NULL && strcmp(curr->info.titolo_brano, elem.titolo_brano) < 0) {
prec = curr;
curr = curr->next;
}
newnode->next = curr;
if (prec != NULL) {
prec->next = newnode;
}
else {
*lis = newnode;
}
}
int CaricaBraniMusicali(char *nomefile, TListaBraniMusicali *plis) {
FILE *f;
TBranoMusicale brano;
int nbrani = 0;
if ((f = fopen(nomefile, "r")) == NULL) {
printf("Errore nell'allocazione della memoria.\n");
exit(1);
}
*plis = NULL;
while (!feof(f)) {
fscanf(f, "%s\n", brano.titolo_brano);
fscanf(f, "%s\n", brano.nome_cantante);
fscanf(f, "%[^\n]s\n", brano.genere_musicale);
fscanf(f, "%d\t", &brano.anno);
fscanf(f, "%d:%d\n", &brano.minuti, &brano.secondi);
InserisciBraniInListaOrdinata(plis, brano);
nbrani++;
}
fclose(f);
return nbrani;
}
/*FUNZIONE PRINCIPALE MAIN*/
int main(void) {
char *nomefile[10];
int scelta, n;
TListaBraniMusicali lista_brani;
TListaGeneriMusicali lista_generi;
lista_brani = CreaListaBraniMusicali();
lista_generi = CreaListaGeneriMusicali();
while (scelta = menu()) {
switch (scelta) {
case 1:
system("CLS");
printf("\t--Funzione di caricamento da file--");
printf("\nInseisci il nome del file da cui caricare i brani: ");
scanf("%s", nomefile);
n = CaricaBraniMusicali(nomefile, &lista_brani);
printf("-> Sono stati caricati %d brani musicali.\n", n);
system("PAUSE");
break;
case 2:
system("CLS");
system("PAUSE");
break;
case 3:
system("CLS");
system("PAUSE");
break;
case 4:
system("CLS");
system("PAUSE");
break;
case 5:
system("CLS");
system("PAUSE");
break;
case 6:
system("CLS");
printf("Grazie per aver utilizzato questo programma.\n\n");
return 0;
system("PAUSE");
break;
}
}
return 0;
}