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++ - Rubrica telefonica
Forum - C/C++ - Rubrica telefonica

Avatar
Pierga (Normal User)
Newbie


Messaggi: 14
Iscritto: 14/04/2009

Segnala al moderatore
Postato alle 8:43
Giovedì, 09/07/2009
Sto scrivendo questa semplice rubrica telefonica. L'inserimeto dei dati è ok, così pure la funzione cerca. Quello che non riesco a fare è la funzione cancella.
Io l'avevo pensata in questo modo: prima il programma chiede il parametro di ricerca, e scorre tutta la rubrica. Quando trova la linea corrispondente la deve cancellare.

Codice sorgente - presumibilmente Delphi

  1. ...
  2. if (i==3) {
  3.    string line, obiettivo; //Diachiarazione delle due stringhe
  4.    size_t found; //Richiamo funzione "found" per trovare un testo
  5.    string::iterator it;
  6.    fstream myfile;//fstream per leggere e scrivere su myfile
  7.    myfile.open ("Rubrica.txt"); //File aperto per operazioni
  8.                                 //di input o output
  9.    cout<<"Inserire contatto: ";
  10.    cin>>obiettivo; //Ciò che si scrive viene salvato nella string obiettivo
  11.    cout<<endl<<endl;
  12.    
  13.    while (! myfile.eof() )    //.eof restituisce vero quando il file di testo
  14.                               //è arrivato alla fine
  15.     {
  16.       getline (myfile,line); //Dà alla string line ciò che è scritto nella riga
  17.      
  18.    found=line.find(obiettivo); //Cerca in line ciò che scritto in obiettivo
  19.    if (found!=string::npos) {
  20.  
  21. //se lo trova stampa line ovvero il contatto che sta per cancellare. Poi assegna a
  22. //line " " e dovrebbe sovrascriverlo. Ma qui si blocca...
  23.  
  24.       cout<<line<<endl;
  25.       line=" ";
  26.       myfile << line;
  27.       }
  28.      
  29.       }
  30.    myfile.close();
  31.     }



Cosa c'è che non va? Grazie a chiunque risponda, sto impazzendo! :blush::heehee::rofl::om::noway:

PM Quote
Avatar
Pierga (Normal User)
Newbie


Messaggi: 14
Iscritto: 14/04/2009

Segnala al moderatore
Postato alle 8:46
Giovedì, 09/07/2009
Ho provato anche a metttere:
Codice sorgente - presumibilmente Delphi

  1. while (! myfile.eof() )    //.eof restituisce vero quando il file di testo
  2.                               //è arrivato alla fine
  3.     {
  4.       getline (myfile,line); //Dà alla string line ciò che è scritto nella riga
  5.      
  6.    found=line.find(obiettivo); //Cerca in line ciò che scritto in ricerca
  7.    if (found!=string::npos) {//se lo trova stampa line. Controlla tutte le righe
  8.                              //del file e se trova qualcosa lo stampa.
  9.       cout<<line<<endl;
  10.       line.erase (line.begin(), line.end()); //prima ho messo: string::iterator it;
  11.       myfile << line;
  12.       }
  13.      
  14.       }



Ho esaurito le idee...

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 10:01
Giovedì, 09/07/2009
Se accedi ad un file sequenziale di testo, non puoi leggere e scrivere le righe.

Per "cancellare" una riga da un file sequenziale, devi leggerlo e ricopiarlo in un altro file tranne la riga che intendi eliminare.

Naturalmente, alla fine dovrai eliminare il file originale e rinominare il nuovo.


- Se le mie risposte non vi soddisfano, ignoratele, altrimenti un "grazie" e' molto gradito ...

"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
PM Quote
Avatar
Pierga (Normal User)
Newbie


Messaggi: 14
Iscritto: 14/04/2009

Segnala al moderatore
Postato alle 10:37
Giovedì, 09/07/2009
Capito, non c'è quindi altro modo?
Per forza non andava!:k::doubt:
Grazie della dritta!

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 10:45
Giovedì, 09/07/2009
Non c'e' altro modo con i file sequenziali (a lunghezza variabile della linea).

Se il record ha lunghezza fissa, allora puoi accedere in binario, con la fseek, calcolando il punto in cui si trova la linea da modificare ma non potrai "eliminarla" fisicamente neanche in questo caso; potrai solamente "segnarla" come eliminata con un carattere speciale.

Infine, se lavori con un DB, sarà il suo motore a gestire queste operazioni.


- Se le mie risposte non vi soddisfano, ignoratele, altrimenti un "grazie" e' molto gradito ...

"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
PM Quote
Avatar
Pierga (Normal User)
Newbie


Messaggi: 14
Iscritto: 14/04/2009

Segnala al moderatore
Postato alle 11:37
Giovedì, 09/07/2009
DB??? cos'è??? Si mangia??? :heehee:
Cmq appena riesco (per me la programmazione è un hobby quasi appena nato) modifico il programma e posto il risultato!

PM Quote
Avatar
Pierga (Normal User)
Newbie


Messaggi: 14
Iscritto: 14/04/2009

Segnala al moderatore
Postato alle 20:02
Sabato, 11/07/2009
Dunque con devC++ ho fatto questo. Ciò che vorrei voluto aggiungere ma non ci sono riuscito è:
-Se per sciegliere l'operazione da fare (aggiungi, cerca, cancella o esci) si digita una lettera, il programma deve dare errore e comunicare di digitare un numero fra 1 e 4. Io sono riuscito a farlo solo per i numeri maggiori di 4.
-Se il programma non trova il contatto desiderato nella lista deve dare: "Contatto non trovato."
-Se il contatto esiste già e l'utente prova a reinserirlo il programma deve dare "Contatto già esistente."
Qualche consiglio su come procedere? Cosa potrei aggiungere oltre a queste cose?

Questo è il lavoro svolto fin'ora:
Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <fstream>
  4. #include <string>
  5. #include <windows.h>
  6. using namespace std;
  7.  
  8. //Funzione per spostarsi nella finestra di dialogo
  9. void gotoxy(int x, int y) {
  10. for (int i = 0; i < y; i++) {
  11. cout<<"\n";
  12. }
  13. for (int i = 0; i < x; i++) {
  14. cout<<" ";
  15. }
  16. }
  17.  
  18. int main ()
  19. {
  20. int i=0;
  21. gotoxy(28,2);
  22. cout<<"Rubrica telefonica v1.0"<<endl<<endl;
  23.  
  24. //Ciclo del menù
  25. while (i==0) {
  26.    gotoxy(37,1);
  27.    cout<<"Menu'"<<endl;
  28.    gotoxy(24,0);
  29.    cout<<"1) Inserisci un nuovo contatto.\n";
  30.    gotoxy(24,0);
  31.    cout<<"2) Cerca.\n";
  32.    gotoxy(24,0);
  33.    cout<<"3) Cancella contatto.\n";
  34.    gotoxy(24,0);
  35.    cout<<"4) Esci.\n"<<endl;
  36.    cout<<"Cosa vuoi fare? ";
  37.    cin>>i;
  38.    while (i>4) {
  39.          cout<<"Errore...\n"<<"Scegli l'opzione 1,2,3 o 4";
  40.          i=0;
  41.          }
  42.    cout<<endl<<endl<<endl;
  43.    
  44. //Inserimento dati
  45. if(i==1) {//Se i coincide con 1, altrimenti viene assegnato ad i il valore 1!!
  46.         ofstream myfile; //ofstream per scrivere su di un file
  47.         myfile.open ("Rubrica.txt", ios::app); //Crea-apre il file Rubrica.txt
  48.                                                //e parte a scrivere dalla fine
  49.         struct tiporec          //Viene dichiarata la
  50.         { char nome[30];        //struct e vengono
  51.         char cognome[30];       //inserite le variabili
  52.         char  cell[11];
  53.         }rec;        //rec è il nome adoperato per inserire i dati nella struct
  54.        
  55.        
  56.         //Inserimento dei dati
  57.         cout<<" Nome:  ";
  58.         cin.getline(rec.nome,30);
  59.         cin.getline(rec.nome,30);
  60.         cout<<" Cognome:  ";
  61.         cin.getline(rec.cognome,30);
  62.         cout<<" Numero telefono: ";
  63.         cin.getline(rec.cell,11);
  64.         cout<<endl<<endl;
  65.        
  66.         //Stampa nel file i dati inseriti
  67.         myfile << rec.nome << " " << rec.cognome << " " << rec.cell << "\n";
  68.         cout<<"Contatto inserito: "<<rec.nome<<" "<<rec.cognome<<" "<<rec.cell
  69.         <<endl<<endl;
  70.         myfile.close();
  71.         i=0;
  72.         }
  73.  
  74.  //Cerca contatto      
  75. if (i==2) {//Se i coincide con 2, altrimenti viene assegnato ad i il valore 1!!
  76.    string line, ricerca; //Diachiarazione delle due stringhe
  77.    size_t found; //Richiamo funzione "found" per trovare un testo
  78.    ifstream myfile; //ifstream per leggere da un file
  79.    myfile.open ("Rubrica.txt", ios::out); //File aperto per operazioni di
  80.                                           //output
  81.    cout<<"Inserire parametro di ricerca: ";
  82.    cin>>ricerca; //Ciò che si scrive viene salvato nella string ricerca
  83.    cout<<endl<<endl;
  84.    
  85.    while (! myfile.eof() )    //.eof restituisce vero quando il file di testo
  86.                               //è arrivato alla fine
  87.     {
  88.       getline (myfile,line); //Dà alla string line ciò che è scritto nella riga
  89.      
  90.    found=line.find(ricerca); //Cerca in line ciò che scritto in ricerca
  91.    if (found!=string::npos) {//se lo trova stampa line. Controlla tutte le righe
  92.                              //del file e se trova qualcosa lo stampa.
  93.       cout<<line<<endl<<endl;
  94.       }
  95.    }
  96.    
  97.    cout<<"Ricerca terminata.\n";
  98.    myfile.close();
  99.    i=0;
  100.     }
  101.    
  102.    
  103.  //Cancellare un contatto
  104. if (i==3) {
  105.    string line, ricerca;
  106.    size_t found;
  107.    ifstream myfile;
  108.    myfile.open ("Rubrica.txt", ios::out);
  109.    cout<<"Inserire parametro di ricerca: ";
  110.    cin>>ricerca;
  111.    cout<<endl<<endl;
  112.    
  113.    while (! myfile.eof() )    //.eof restituisce vero quando il file di testo
  114.                               //è arrivato alla fine
  115.     {
  116.       getline (myfile,line); //Dà alla string line ciò che è scritto nella riga
  117.      
  118.    found=line.find(ricerca);   //Cerca in line ciò che scritto in ricerca
  119. /*Se lo trova stampa "Contatto cancellato: nome contatto". Altrimenti stampa
  120. tutte le altre righe in un altro file ("file_trasf.txt"). Una volta letto tutto
  121. il file Rubrica.txt e trascritto tutto tranne il contatto da cancellare in
  122. file_trasf.txt, il programma cancella Rubrica.txt e rinomina file_trasf in
  123. Rubrica.txt. Risultato: l'elenco è quello di prima, ma senza il contatto che si
  124. voleva eliminare*/                                      
  125.    if (found!=string::npos) {
  126.       cout<<"Contatto cancellato: "<<line<<endl<<endl;
  127.       }
  128.      
  129.    else {                                        
  130.         ofstream myfile;
  131.         myfile.open ("file_trasf.txt", ios::app);
  132.         myfile<<line<<"\n";
  133.         myfile.close();
  134.         }
  135.       }
  136.    myfile.close();
  137.    remove ("Rubrica.txt");
  138.    rename ("file_trasf.txt", "Rubrica.txt");
  139.    i=0;
  140.     }
  141.  
  142.  //Uscita dal programma  
  143. if (i==4) {
  144.      }
  145.     }
  146.  
  147. return 0;
  148. }


PM Quote