C salvataggio caratteri strani su file

di il
8 risposte

C salvataggio caratteri strani su file

Ciao quando provo a salvare su file qualsiasi cosa mi aggiunge dei caratteri strani sul file
Come posso risolvere?

8 Risposte

  • Re: C salvataggio caratteri strani su file

    Ti pare possibile darti una risposta sensata?
  • Re: C salvataggio caratteri strani su file

    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);
    }
  • Re: C salvataggio caratteri strani su file

    Esiste un main con cui chiami queste funzioni? E le strutture dati come sono fatte?

    Cosa inserisci ad esempio? Cosa ottieni nel file? Quali sarebbero questi caratteri strani?
  • Re: C salvataggio caratteri strani su file

    Inserisco il nome ,cognome e il compleanno per fare una rubrica e nel file ottengo il nome con dei caratteri o simboli in aggiunta invece per il cognome e compleanno non avviene
    Le struttura dati è una lista con il nome cognome e compleanno piu il nodo successivo
  • Re: C salvataggio caratteri strani su file

    Ma tu vuoi risolvere il problema o no? Ti avevo detto di "mostrare" la struttura e il main non di raccontarlo ...
  • Re: C salvataggio caratteri strani su file

    Main
    #include <stdio.h>
    #include <stdlib.h>
    #include "rubrica.h"
    #include "dati.h"
    #define SIZE 20
    /*
     * 
     */
     
    void instructions(void);
    
    int main(int argc, char** argv) 
    {
        char nome[SIZE] = "\0";//Stringa del nome
        char cognome[SIZE] = "\0";//Stringa del cognome
        char birthday[SIZE] = "\0";//Stringa del compleanno
        unsigned int choice;//Scelta dell'utente
        
        instructions();//Lista di possibili scelte
        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(nome,cognome,birthday);//Elimina Contatto dalla Rubrica
                        break;
                 
                case 3://Stampa
                        print();//Stampa Rubrica
                        break;
                 
                        
                case 4:
                        getchar();//Pulisce il buffer
                        printf("Enter name to modify: ");
                        fgets(nome,SIZE,stdin);
                        printf("Enter surname to modify: ");
                        fgets(cognome,SIZE,stdin);
                        printf("Enter birthday to modify: ");
                        fgets(birthday,SIZE,stdin);
                        modify(nome,cognome,birthday);
                        break;
             
    	   case 5:
    		    printf("Goodbye\n");
    		    break;
    		           
                default:
                        printf("Invalid Choice\n");
                        break;
                        
            }
            
            instructions();
            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");
        printf("? ");
    }
    Strutture dati
    struct Rubrica
    {
        char name[SIZE];
        char surname[SIZE];
        char birthday[SIZE];
        struct Rubrica *nextPtr;
    };
    
    typedef struct Rubrica Rubrica;
    typedef Rubrica *RubricaPtr;
    
  • Re: C salvataggio caratteri strani su file

    Quando copi i dati non devi dimenticare il terminatore, quindi aggiunere 1

    strncpy(newPtr->name,nome,strlen(nome)+1);
    strncpy(newPtr->surname,cognome,strlen(cognome)+1);
    strncpy(newPtr->birthday,compleanno,strlen(compleanno)+1);

    e per scrivere su file non devi usare tutti i caratteri della stringa e devi separare i campi con uno spazio

    fprintf(filePtr,"%s %s %s\n",currentPtr->name,currentPtr->surname,currentPtr->birthday);
  • Re: C salvataggio caratteri strani su file

    Grazie mille ora funziona
Devi accedere o registrarti per scrivere nel forum
8 risposte