Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Salvare e caricare dati da un file esterno
Forum - C/C++ - Salvare e caricare dati da un file esterno

Avatar
Kollo (Normal User)
Newbie


Messaggi: 1
Iscritto: 13/04/2012

Segnala al moderatore
Postato alle 19:09
Martedì, 17/04/2012
Salve a tutti.
Per un progetto d'esame all'università devo preparare una sorta di agenda elettronica in c++, però ho un problema nel gestire un file esterno, come ad esempio un file .cvs oppure .txt

Per farvi capire: nella mia agenda io creo una classe contact (per i contatti della rubrica) che ha come attributi nome, cognome, telefono fisso, telefono cellulare ed email; e poi creo una classa notes (per le note) che ha come attributi giorno, mese, anno, posto, ora e nota.

ora vi scrivo i codici riguardanti la gestione dei file esterni

Codice sorgente - presumibilmente C/C++

  1. int main () {
  2.  
  3.     // Creo i vettori con le note ed i contatti
  4.     int n=0, m=0;
  5.     notes N[m];
  6.     contact C[n];
  7.  
  8.     C[n].load_contacts(C,n);
  9.     N[m].load_notes(N,m);
  10.     ....... // poi c'è altra roba irrilevante per la gestione dei file esterni
  11. }



Codice sorgente - presumibilmente C#

  1. void contact::load_contacts(contact *C, int &n) {
  2.  
  3.     fstream rubrica;
  4.     rubrica.open("contacts.cvs", ios::in);
  5.  
  6.     // Setto n come il numero dei contatti
  7.     rubrica.seekg (0, ios::end);
  8.     n=1+rubrica.tellg();
  9.     rubrica.seekg (0, ios::beg);
  10.  
  11.     int line_max_lenght=105;
  12.     char rubrica_string[n][line_max_lenght];
  13.     int j=0;
  14.  
  15.     // Metto le righe di rubrica in string
  16.     while (rubrica) {
  17.         rubrica.getline(rubrica_string[j++],line_max_lenght);
  18.     }
  19.  
  20.     // Metto i contatti nel vettore C
  21.     char *z;
  22.     for (int count=0,k=0;count<j-1;count++) {  // k serve a dire in quale parte della riga siamo
  23.         z=strtok(rubrica_string[count],",");
  24.         while (z!=NULL || k<5) {
  25.             switch (k) {
  26.             case 0:
  27.                 strcpy(C[count].name,z);
  28.                 k++;
  29.                 z=strtok(NULL,",");
  30.                 break;
  31.             case 1:
  32.                 strcpy(C[count].surname,z);
  33.                 k++;
  34.                 z=strtok(NULL,",");
  35.                 break;
  36.             case 2:
  37.                 strcpy(C[count].h_phone,z);
  38.                 k++;
  39.                 z=strtok(NULL,",");
  40.                 break;
  41.             case 3:
  42.                 strcpy(C[count].m_phone,z);
  43.                 k++;
  44.                 z=strtok(NULL,",");
  45.                 break;
  46.             case 4:
  47.                 strcpy(C[count].email,z);
  48.                 k++;
  49.                 z=strtok(NULL,",");
  50.                 break;
  51.             }
  52.         }
  53.     }
  54.     rubrica.close();
  55. }



Codice sorgente - presumibilmente C#

  1. void notes::load_notes(notes *N, int &m) {
  2.  
  3.     fstream Note;
  4.     Note.open("notes.cvs", ios::in);
  5.  
  6.     // Setto m come il numero delle note
  7.     Note.seekg (0, ios::end);
  8.     m=1+Note.tellg();
  9.     Note.seekg (0, ios::beg);
  10.  
  11.     int line_max_lenght=265;
  12.     char note_string[m][line_max_lenght];
  13.     int j=0;
  14.  
  15.     // Metto le righe di note in string
  16.     while (Note) {
  17.         Note.getline(note_string[j++],line_max_lenght);
  18.     }
  19.  
  20.     // Metto le note nel vettore N
  21.     char *z;
  22.     int year, month, day;
  23.     for (int count=0,k=0;count<j-1;count++) {  // k serve a dire in quale parte della riga siamo
  24.         z=strtok(note_string[count],",");
  25.         while (z!=NULL || k<6) {
  26.             switch (k) {
  27.             case 0:
  28.                 year=(int)(z-'0');
  29.                 N[count].year=year;
  30.                 k++;
  31.                 z=strtok(NULL,",");
  32.                 break;
  33.             case 1:
  34.                 month=(int)(z-'0');
  35.                 N[count].month=month;
  36.                 k++;
  37.                 z=strtok(NULL,",");
  38.                 break;
  39.             case 2:
  40.                 day=(int)(z-'0');
  41.                 N[count].day=day;
  42.                 k++;
  43.                 z=strtok(NULL,",");
  44.                 break;
  45.             case 3:
  46.                 strcpy(N[count].place,z);
  47.                 k++;
  48.                 z=strtok(NULL,",");
  49.                 break;
  50.             case 4:
  51.                 strcpy(N[count].time,z);
  52.                 k++;
  53.                 z=strtok(NULL,",");
  54.                 break;
  55.             case 5:
  56.                 strcpy(N[count].note,z);
  57.                 k++;
  58.                 z=strtok(NULL,",");
  59.                 break;
  60.             }
  61.         }
  62.     }
  63.     Note.close();
  64. }



Codice sorgente - presumibilmente C/C++

  1. void contact::insert_contact(contact *C, int &n) {
  2.  
  3.     ..... // prima c'è roba irrilevante
  4.  
  5.     // Carico il contatto inserito nel file dei contatti
  6.     ofstream rubrica("contacts.cvs",ios::app);
  7.     rubrica<<C[n].name<<","<<C[n].surname<<","<<C[n].h_phone<<","<<C[n].m_phone<<","<<C[n].email<<endl;
  8.     rubrica.close();
  9. }



Codice sorgente - presumibilmente C/C++

  1. void notes::insert_note(notes *N, int &m) {
  2.    
  3.     ..... // prima c'è roba irrilevante
  4.  
  5.     // Carico la nota inserita nel file delle note
  6.     ofstream Note("notes.cvs",ios::app);
  7.     Note<<N[m].day<<","<<N[m].month<<","<<N[m].year<<","<<N[m].place<<","<<N[m].time<<","<<N[m].note<<endl;
  8.     Note.close();
  9. }





Ora vi descrivo la situazione: una volta creato il file exe, vado a provare il programma, inizialmente sembra tutto funzionare, poichè non ci sono ancora contatti o note salvate, però una volta che io provo ad inserire un contatto od una nota, e poi chiudo il programma, vedo che mi si è creato il file .txt, però quando provo a riaprire l'exe il programma non parte e mi si apre la finestra che mi dice che l'exe ha smesso di funzionare; in oltre se vado ad aprire per curiosità il file .txt che mi si è creato, vedo che all'interno non c'è scritto le cose che io avevo inserito, ma bensì roba come ",˙˙˙˙,,˜¨ŝ(,G". Poi se provo ad eliminare il file .txt che mi si è creato, a quel punto il programma torna a funzionare, però naturalmente è senza dati salvati.

Vi chiedo aiuto poichè io da solo non sono riuscito a trovare il problema.
Vi ringrazio tanto in anticipo!
Saluti, Michele

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 23:47
Martedì, 17/04/2012
Non ho controllato tutto il codice ma non puoi scrivere nel main questo

Codice sorgente - presumibilmente C/C++

  1. // Creo i vettori con le note ed i contatti
  2.     int n=0, m=0;
  3.     notes N[m];
  4.     contact C[n];



in quanto così non crei nulla (un vettore di 0 elementi non esiste).

Inizia col modificarlo in

Codice sorgente - presumibilmente Plain Text

  1. notes N[10];
  2. contact C[10];



in modo da usare in seguito per le prove

N[0]...

e

C[0]...




P.S. Sicuramente usi DevC++ e mingw che, in quanto aderente alle regole C99 permette di scrivere cose come array[n] che non avrebbero senso con tanti altri compilatori. Ti consiglio di evitare questa modalità di allocazione degli elementi degli array e di usare le classiche new ... delete del C++

Ultima modifica effettuata da nessuno il 17/04/2012 alle 23:47


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote