Rubrica

di il
5 risposte

Rubrica

Ciao sto provando ad implementare la rubrica in C soltanto che dopo aver alcuni contatti mi occupa tutta la ram in tutte le operazioni in particolare nell'inserimento
Ecco il codice
Main
#include <stdio.h>
#include <stdlib.h>
#include "rubrica.h"

 
void instructions(void);

int main(int argc, char** argv) 
{
    RubricaPtr startPtr = NULL;//Da cancellare
    char nome[30] = "\0";//Stringa del nome
    char cognome[30] = "\0";//Stringa del cognome
    char birthday[30] = "\0";//Stringa del compleanno
    unsigned int choice;//Scelta dell'utente
    
    instructions();//Lista di possibili scelte
    printf("? ");
    scanf("%ud",&choice);
          
    while (choice != 5)
    {
        
        
        switch (choice)
        {
            case 1://Inserimento
                    printf("Enter name: ");
                    scanf("%19s",nome);
                    printf("Enter surname: ");
                    scanf("%19s",cognome);
                    printf("Enter birthday: ");
                    scanf("%19s",birthday);
                    insert(nome,cognome,birthday);//Inserisce Contatto nella Rubrica
                    break;
                
            case 2://Cancellazione
                    printf("Enter name to delete: ");
                    scanf("%19s",nome);
                    printf("Enter surname to delete: ");
                    scanf("%19s",cognome);
                    printf("Enter birthday to delete: ");
                    scanf("%19s",birthday);
                    deleteList(&startPtr,nome,cognome,birthday);//Elimina Contatto dalla Rubrica
                    break;
             
            case 3://Stampa
                    print();//Stampa Rubrica
                    break;
                    
            default:
                    printf("Invalid Choice\n");
                    break;
                    
        }
        
        instructions();
        printf("? ");
        scanf("%ud",&choice);
    }
    return (EXIT_SUCCESS);
}

void instructions(void)
{
    printf("1 to insert into rubrica\n");
    printf("2 to delete from rubrica\n");
    printf("3 to print rubrica\n");
    printf("4 to modify rubrica\n");
    printf("5 to exit\n");
}
Rubrica
#include  <stdio.h>
#include <stdlib.h>
#include "rubrica.h"
#include <string.h>
#include "confronto.h"
#include "salvataggioFile.h"

void insert(char nome[],char cognome[],char compleanno[])
{
    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
    size_t x = 0;
    
    startPtr = letturaFile();//Lettura della lista
    
    newPtr = malloc(sizeof(Rubrica));
    
    if (newPtr != NULL)//Memoria presente
    {
        for(x = 0;nome[x] != '\0';x++)
        {
            newPtr->name[x] = nome[x];//Insert character in the structure
        }
                 
        newPtr->name[x] = '\0';
        
        for (x = 0;cognome[x] != '\0';x++)
        {
            newPtr->surname[x] = cognome[x];//Inserisce il cognome nella struttura
        }
        
        newPtr->surname[x] = '\0';
        
        for (x = 0;compleanno[x] != '\0';x++)
        {
            newPtr->birthday[x] = compleanno[x];//Inserisce il compleanno nella struttura
        }
        
        newPtr->birthday[x] = '\0';
        newPtr->nextPtr = NULL;
        
        previousPtr = NULL;//Nodo precedente
        currentPtr = startPtr;//Contatto corrente è il primo
        
        while(currentPtr != NULL)//Finche il contatto non punta a nulla
        {
            previousPtr = currentPtr;//Contatto precedente
            currentPtr = currentPtr->nextPtr;//punta al nuovo contatto
            
        }
        
        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;
        
        while(currentPtr != NULL)
        {
            writeFile(currentPtr);
            tempPtr = currentPtr;//Nodo temporaneo
            currentPtr = currentPtr->nextPtr;//Avanzamento di nodo
            free(tempPtr);//Libera memoria
        }
        
    }
    else//Memoria non presente
    {
        printf("No memory available");
    }
    
    printf("\n");
}

void deleteList(RubricaPtr *sPtr,char nome[],char cognome[],char birthday[])
{
    //Delete contatto from the rubrica
    RubricaPtr tempPtr;//Puntatore temporaneo al nodo da cancellare
    RubricaPtr previousPtr = NULL;
    RubricaPtr currentPtr = *sPtr;
    int isFound = 0;//Variable that rappresent if the element was found or not
    
    while(currentPtr != NULL && isFound)
    {
        isFound = confrontoContatto(nome,cognome,birthday,currentPtr);//Controllo se è l'elemento corretto      
        previousPtr = currentPtr;//Va avanti di elemento
        currentPtr = currentPtr->nextPtr;//Puntatore al nuovo elemento
        
    }
    
    if(previousPtr == NULL)
    {
        //Caso in cui l'elemento da eliminare è in testa alla Rubrica
        tempPtr = *sPtr;//Copia temporanea dell'elemento
        *sPtr = tempPtr->nextPtr;//Ora la lista punta al secondo elemento
        free(tempPtr);//Libera la memoria dell'elemento cancellato
    }
    else
    {
        if(isFound)
        {
            //caso in cui viene trovato il valore 
            tempPtr = currentPtr;//Copia temporanea dei valori
            previousPtr->nextPtr = currentPtr->nextPtr;//Punta all'elemento successivo
            free(currentPtr);//Libera la memoria
        }
        else
        {
            printf("Element not found\n");
        }
    }
    
}
int isEmpty(RubricaPtr sPtr)
{
    return sPtr == NULL;
}

void print(void)
{
    RubricaPtr startPtr = NULL;//Nodo iniziale
    
    startPtr = letturaFile();
    
    if (isEmpty(startPtr))
    {
        printf("List empty\n");
    }
    else
    {
        printf("List is:\n");
        printf("%-20s\t%-20s\t%-20s\n","Name","Surname","Birthday");
        
        while(startPtr != NULL)
        {
            printf("%-19s\t%-19s\t %-19s\n",startPtr->name,startPtr->surname,startPtr->birthday);
            startPtr = startPtr->nextPtr;
        }
        
    }
    
    printf("\n");
}
Salvataggio file
#include <stdio.h>
#include <stdlib.h>
#include "rubrica.h"

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
            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))
        {
            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);
}
Potreste aiutarmi a risolvere l'errore penso avvenga nell'allocazione della memoria nella funzione Insert di Rubrica ma non so come risolvere

5 Risposte

  • Re: Rubrica

    Cerca di essere più preciso sull'errore, quando avviene e cosa succede perché non ho capito molto ...
  • Re: Rubrica

    Il mio problema è che viene occupata tutta la Ram mentre eseguo il programma soprattutto quando provo ad inserire i contatti e a stampare i contatti inseriti
  • Re: Rubrica

    Esegui in debug passo passo il ciclo di lettura da file e controlla se termina correttamente
  • Re: Rubrica

    Ho trovato che continua a leggere il file all'infinito ma non saprei come risolvere
  • Re: Rubrica

    snake98 ha scritto:


    ho trovato che continua a leggere il file all'infinito ma non saprei come risolvere
    Il problema potrebbe essere qui

    "%-19s%-19s%-19s\n"
Devi accedere o registrarti per scrivere nel forum
5 risposte