Problema salvataggio su un file

di Frans_94 il
9 risposte

Buonasera ragazzi, ho un grande dubbio, che non riesco a risolvere.

Nel breve dovrei salvare una DATA ed un ORARIO, al momento faccio nel seguente modo :

1) DATA : inserisco singolarmente GG, MM, AAAA, e poi salvo come char per poi salvare sul file

2) ORARIO : inserisco singolarmente HH,MM e poi salvo come char per poi salvare sul file

snprintf(data_In, 11, "%d/%d/%d", giorno_In, mese_In, anno_In);
            
            strcpy(nuovo_Nodo -> data, data_In);

snprintf(ora_In, 5, "%d|%d", hh_In, mm_In);
        strcpy(nuovo_Nodo -> ora, ora_In);

Il problema lo riscontro nell'orario in quanto come CHAR mi salva oltre l'orario la lettera “d” come a seguire (caso in cui ore_In = 17 e mm_In = 55)

17|55d

Con la DATA non ho problemi in quanto salva nel formato desiderato ovvero, come nel caso in cui gg=12, mese = 1, anno = 2023:

12/1/2023

Spero di essere stato chiaro e spero siate in grado di aiutarmi. Grazie mille ancora

9 Risposte

  • Ma l'hai seguito il consiglio del libro? Lo sai cos'è un char? Che poi anche ammesso il tuo dubbio, 55 come carattere sarebbe '7', mentre 'd' è 100. Non è che ti è sfuggita una d in più nel codice?

  • Grazie per la risposta. Si, so cosa è una char,non capisco come mai riscontro questo problema solo nell ORA e non nella DATA. 

    Mi sembra di aver scritto tutto correttamente. Quella ‘d’ non capisco prorpio da dove esca, non ho punti in cui si possa essere aggiunta. 

  • Devi postare il codice completo se vuoi una mano. Magari hai un buffer sporco e ti prende la d di una scrittura precedente

  • In breve il codice è il seguente :

    // DATA
        bool data_Corr = true;
    
        
         do {
                if (data_Corr == false) {
                
                    printf("\t \t \t \n \n Attenzione! \n \n");
                    printf("\t \t \t La data inserita deve essere succesiva a quella corrente.\n");
                }
    
                    printf("\t \t \t \t INSERIMENTO NUOVO SPETTACOLO \n \n ");
    
                    do {
                        if (!data_CorrettaIn) {
    
                            printf("\n\n \t \t \t  Attenzione!\n");
                            printf("\t \t \t La data inserita non e' corretta. Si prega di inserirla nuovamente. \n \n");
                        }
    
                        do {
                            printf("\t \t \t Giorno : ");
                            scanf("%d", &giorno_In);
                        } while (giorno_In < 1 || giorno_In > 31);
    
                        do {
                            printf("\n\t \t \t Mese : ");
                            scanf("%d", &mese_In);
                        } while (mese_In < 1 || mese_In > 12);
    
                        printf("\n\t \t \t Anno : ");
                        scanf("%d", &anno_In);
    
                        data_CorrettaIn = verifica_Data(giorno_In, mese_In, anno_In);
    
                    } while (!data_CorrettaIn);
    
                    data_Corr = (differenza_DateOggi(giorno_In, mese_In, anno_In) >= 0);
                    
            } while (!data_Corr);
    
                while ('\n' != getchar());
    
                snprintf(data_In, 11, "%d/%d/%d", giorno_In, mese_In, anno_In);
                
                strcpy(nuovo_Nodo -> data, data_In);
    
        // ORA
        bool ora_Corr = true;
    
         do {
                if (ora_CorrettaIn == false) {
                    clear_Console();
                    titolo();
                    
                    printf("\t \t \t \n \n Attenzione! \n");
                    printf("\t \t \t L'ora' inserita non e' corretta. Riprovare. \n \n");
                }
    
                    printf("\t \t \t Ora : ");
                    scanf("%d", &hh_In);
                    
                    printf("\n\t \t \t Minuti: ");
                    scanf("%d", &mm_In);
                    
                    while ('\n' != getchar());
                        
                    ora_CorrettaIn = verifica_Ora(hh_In, mm_In);
    
            } while (!ora_CorrettaIn);
    
            snprintf(ora_In, 5, "%d|%d", hh_In, mm_In);
            strcpy(nuovo_Nodo -> ora, ora_In);
    
    	}
    			
    	// Verifico se nel file ci sono utenti registrati (LISTA VUOTA o LISTA NON VUOTA)
        fseek(fp, 0, SEEK_END); 
        long size = ftell(fp); 
        		
        if (size == 0) {
    
    		fprintf(fp, "%d,%d,%s,%s,%s,%d,%d", nuovo_Nodo -> sala, nuovo_Nodo -> id, nuovo_Nodo -> titolo, nuovo_Nodo -> data,
                       nuovo_Nodo -> ora, nuovo_Nodo -> posti_disponibili, nuovo_Nodo -> posti_occupati); 
                        
    	} else { //filE NON VUOTO : controllare ID
    
    
            fprintf(fp, "\n%d,%d,%s,%s,%s,%d,%d", nuovo_Nodo -> sala, nuovo_Nodo -> id, nuovo_Nodo -> titolo, nuovo_Nodo -> data,
                       nuovo_Nodo -> ora, nuovo_Nodo -> posti_disponibili, nuovo_Nodo -> posti_occupati); 
        }
    

    La parte relativa alla DATA funziona correttamente, l'ORA invece mi crea la “d” finale nel salvataggio su file, ad esempio se inserisco 17 e 15 sul file compare “17|15d”.

  • Per completezza queste sono alcune righe salvate nel file in cui si può notare il problema riscontrato :

    											2,2,AAA,23/12/2024,17|15d,100,0
    											2,3,AAA,12/12/2025,17|15d,100,0
  • Prendi un debugger e attaccati al codice, perché probabilmente c'è qualcosa che non funziona da qualche parte al di fuori del segmento di codice che hai postato.

    Prova a fare

    memset(ora_In, 0, sizeof(ora_In));
    snprintf(ora_In, 5, "%d|%d", hh_In, mm_In);
  • Poi comunque per l'ora dovresti prevedere 6 caratteri, così come hai fatto 10+1 per la data

  • Come ribadito da Weierstrass il problema è solo dovuto al fatto che non hai previsto lo spazio per il teeminatore. Per la data 10+1 e per l'ora 5+1

    È un errore comune di chi inizia non tenere conto del terminatore delle stringhe

  • Risolto, grazie mille. Bisognava aumentare di 1 la string, anche se era una operazione che avevo fatto tempo fa, ma sicuramente avevo lasciato qualche refuso. Grazie ancora

Devi accedere o registrarti per scrivere nel forum
9 risposte