Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Problema con record e file di record [C++]

    Ciao a tutti premetto che sono uno studente di terza superiore (anzi ora quarta), e ho imparato la programmazione imperativa con c++ durante quest'anno scolastico. Recentemente mio papà mi ha chiesto di fare un programmino che gli permettesse di scrivere una serie di attività e la data di quando le esegue. Ad esempio se il giorno 21/06/2011 fa un lavoro X vorrebbe dire al mio programma che ha fatto quel lavoro e il giorno, e a richiesta stampare tutti i lavori o i lavori divisi per mese o per anno. Se mi sono spiegato male ditemelo che cerco di farlo meglio . Ho pensato di fare un record con due array di caratteri, uno di dimensione 10 per la data e uno di dimensione 1000 per l'attività. Poi una volta inseriti i dati salvo il record in un file. Ho fatto una funzione che rileva la data odierna, chiede all'utente se l'attività è stata svolta in quella data e, se la risposta è no, chiede all'utente la data in cui è stata svolta (con tutti i controlli per giorno, mese, anno), e infine chiede di scrivere l'attività svolta. Per la data l'input è un array di caratteri per l'attività l'input è una stringa e poi la converto in array di caratteri per assegnarla alle variabili del record. Ad esempio:
    codice:
    getline(cin, es);
    strcpy(att.attes,es.c_str());
    Poi il record viene restituito alla funzione per scrivere sul file e scritto. Il problema è che se vado a controllare il contenuto della data memorizzata nel record ottengo la data e subito attaccata l'attività. Esempio: la data è "21/06/2011", l'attività "xyz", l'output è:
    21/06/2011xyz
    Se poi stampo anche l'attività e prima uno spazio, cioè:
    codice:
    cout<<att.dataes<<" "<<att.attes;
    ottengo:
    21/06/2011xyz xyz

    Come posso fare per risolvere ciò??
    Grazie a tutti...

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Bisogna vedere il codice che usi per ottenere la att.dataes
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Originariamente inviato da oregon
    Bisogna vedere il codice che usi per ottenere la att.dataes
    Questa rileva la data di oggi:

    codice:
    string RilevData(void){ //Acqiusisce la data di oggi
        int g,m,a;
        ostringstream app;
        string apg,s;
        time_t t=time(NULL); 
        tm *time;
        time=localtime(&t);
        s=""; //Stringa vuota
        g=time->tm_mday; //giorno
        m=(time->tm_mon)+1; //mese
        a=(time->tm_year)+1900; //anno
        app<<g; //Conversione del giorno da numero a stringa
        apg=app.str();
        s=s+apg+"/"; //Aggiornamento data
        app<<m; //Conversione del mese da numero a stringa
        apg=app.str();
        apg=apg.erase(0,2);
        if(m<10)
            apg=apg.insert(0,"0");
        s=s+apg+"/";
        app<<a; //Conversione dell'anno da numero a stringa
        apg=app.str();
        apg=apg.erase(0,3);
        s=s+apg;
        return s;
    }
    Questa è la richiesta di data e attività all'utente:

    codice:
    attivita InsDati(void){
        attivita att;
        string s,apg,es;
        bool ok,cd;
        char rd,ardata[10];
        int i;
        s=RilevData(); //La stringa s contiene la data di oggi
        strcpy(att.dataes,s.c_str()); //Copia il contenuto della stringa s nell'array di caratteri dataes della struttura attivita
        cout<<"L'attivita' e' stata eseguita in data odierna, "<<att.dataes<<" (s/n)? "; 
        ok=0;
        do{ //Ripeti il ciclo finchè...
            cin>>rd;
            rd=tolower(rd); //Fai diventare la lettera minuscola
            if((rd!='s')&&(rd!='n')){ //Risposta sbagliata
            cout<<endl<<"Risposta non corretta. Reinseriscila: ";
            ok=1;
            }
            else{ //Risposta giusta
                if(rd=='s') //Si
                    cout<<endl<<"Ok."<<endl;
                if(rd=='n'){ //No
                    s=""; //Cancellazione data
                    do{ //Ripeti il ciclo finchè...
                        cout<<"Inserisci la data di esecuzione (nel formato gg/mm/aaaa): ";
                        for(i=0;i<10;i++)
                            cin>>ardata[i];
                        cd=ContrData(ardata); //Procedura controllo esattezza data
                        if(cd==1) //Se la data è sbagliata...
                            cout<<"DATA ERRATA!!"<<endl;
                        fflush(stdin); //Pulizia input
                    }while(cd==1); //...la data non è giusta
                    strcpy(att.dataes,ardata); //Copia il contenuto dell'array di caratteri ardata nell'array di caratteri dataes della struttura attivita
                }
            }
        }while(ok==1); //...la data non è giusta
        fflush(stdin);
        cout<<"Inserisci l'attivita' eseguita: "<<endl;
        getline(cin, es);
        strcpy(att.attes,es.c_str()); //Copia il contenuto della stringa es nell'array di caratteri es della struttura attivita
        return att;
    }

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Come è fatta la

    struct attivita

    ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    codice:
    struct attivita{      
    char dataes[10], attes[1000]; 
    };

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ecco il problema ... se la data contiene 10 caratteri

    gg/mm/aaaa

    allora il campo deve essere di 11 per includere il terminatore nul della stringa.

    Altrimenti, la seconda strcpy (quella dell'attività) lo ricopre e quando visualizzi il primo campo ti viene attaccato al secondo.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Cavoli è vero non ci avevo pensato... Ora funziona grazie mille!!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.