Mostro il codice
Inserimento
void insert(const char *nome,const char *cognome,const char *compleanno)
{
/*inserisce il contatto in rubrica e lo salva sul file*/
RubricaPtr newPtr;//Puntatore al contatto da inserire
RubricaPtr previousPtr = NULL;//Puntatore al contatto precedente
RubricaPtr currentPtr = NULL;//Puntatore al contatto corrente
RubricaPtr startPtr = NULL;//Testa della lista
RubricaPtr tempPtr;//Nodo temporaneo
//LETTURA CONTATTI
startPtr = letturaFile();//Legge i contatti da file
newPtr = malloc(sizeof(Rubrica));//ALLOCAZIONE NUOVO ELEMENTO
//SALVAGGIO IN RUBRICA SE LA MEMORIA E' STATA ALLOCATA
if (newPtr != NULL)//Memoria presente
{
//INSERIMENTO NUOVO CONTATTO ***SI POTREBBE FARLO IN UNA FUNZIONE A PARTE
strncpy(newPtr->name,nome,strlen(nome));
strncpy(newPtr->surname,cognome,strlen(cognome));
strncpy(newPtr->birthday,compleanno,strlen(compleanno));
newPtr->nextPtr = NULL;
printf("Sas\n%19s%19s%19s\n",newPtr->name,newPtr->surname,newPtr->birthday);
//SPOSTAMENTO AL PRIMO NODO
previousPtr = NULL;//Nodo precedente
currentPtr = startPtr;//Contatto corrente è il primo
//SCORRIMENTO DELLA LISTA ***SI POTREBBE FARLO IN UNA FUNZIONE A PARTE
while(currentPtr != NULL)//Finche il contatto non punta a nulla
{
previousPtr = currentPtr;//Contatto precedente
currentPtr = currentPtr->nextPtr;//punta al nuovo contatto
}
//MODIFICA LA DISPOSIZIONE DELLA LISTA
if (previousPtr == NULL)//Primo Contatto
{
newPtr->nextPtr = startPtr;
startPtr = newPtr;
}
else
{
previousPtr->nextPtr = newPtr;//Punta al nuovo contatto
newPtr->nextPtr = currentPtr;//Punta al contatto successivo
}
currentPtr = startPtr;
//SALVA I CONTATTI NEL FILE E LI CANCELLA DALLA LISTA ***SI POTREBBE ACCOPPARLO IN UNA FUNZIONE A PARTE
while(currentPtr != NULL)
{
printf("Inserimento\n%19s%19s%19s\n",currentPtr->name,currentPtr->surname,currentPtr->birthday);
writeFile(currentPtr);//SCRITTURA SU FILE
tempPtr = currentPtr;//Nodo temporaneo
currentPtr = currentPtr->nextPtr;//Avanzamento di nodo
free(tempPtr);//Libera memoria
}
}
//MEMORIA NON PRESENTE
else
{
printf("No memory available");
}
printf("\n");
}
Lettura e scrittura su file
RubricaPtr letturaFile(void)
{
RubricaPtr startPtr = NULL;//Testa della lista
RubricaPtr currentPtr = NULL;//Nodo della lista corrente
RubricaPtr previousPtr = NULL;//Nodo precedente
FILE *filePtr;//Puntatore a File
filePtr = fopen("rubrica.txt","r");//Apertura del file
if(filePtr == NULL)
{
//FIle non aperto
printf("File could not be opened\n");
}
else
{
//File aperto
if(feof(filePtr))
{
//File vuoto
printf("File is empty\n");
startPtr = NULL;//Puntatore a lista vuota
}
else
{
startPtr = malloc(sizeof(Rubrica));//Allocazione di Memoria
//Lettura elemento iniziale
if(startPtr != NULL)
{
//Allocazione Avvenuta
fscanf(filePtr,"%19s%19s%19s\n",startPtr->name,startPtr->surname,startPtr->birthday);
startPtr->nextPtr = NULL;//Assegnamento nodo successivo
currentPtr = startPtr;//Assegnamento elemento attuale
}
//Lettura elementi successivi
while(!feof(filePtr))
{
previousPtr = currentPtr;//Avanzamento di nodo
currentPtr = malloc(sizeof(Rubrica));//Allocazione memoria nodo successivo
previousPtr->nextPtr = currentPtr;//Puntatore al nodo successivo dell'elemento precedente
//Lettura elemento successivo
fscanf(filePtr,"%19s%19s%19s\n",currentPtr->name,currentPtr->surname,currentPtr->birthday);
currentPtr->nextPtr = NULL;//Assegnamento nodo successivo
}
}
}
fclose(filePtr);//Chiusura file
return startPtr;
}
void writeFile(RubricaPtr currentPtr)
{
FILE *filePtr;
filePtr = fopen("rubrica.txt","w");
if (filePtr == NULL)
{
//File non aperto
printf("File could not be opened\n");
}
else
{
//File aperto
if(!feof(filePtr))
{
printf("%19s%19s%19s\n",currentPtr->name,currentPtr->surname,currentPtr->birthday);
fprintf(filePtr,"%19s%19s%19s\n",currentPtr->name,currentPtr->surname,currentPtr->birthday);
//File non pieno
}
else
{
//File terminato
printf("Elemento non riuscito ad inserire\n");
}
}
fclose(filePtr);
}