Oppure

Loading
09/07/09 6:43
Pierga
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.

...
if (i==3) {
   string line, obiettivo; //Diachiarazione delle due stringhe
   size_t found; //Richiamo funzione "found" per trovare un testo
   string::iterator it;
   fstream myfile;//fstream per leggere e scrivere su myfile
   myfile.open ("Rubrica.txt"); //File aperto per operazioni
                                //di input o output
   cout<<"Inserire contatto: ";
   cin>>obiettivo; //Ciò che si scrive viene salvato nella string obiettivo
   cout<<endl<<endl;
   
   while (! myfile.eof() )    //.eof restituisce vero quando il file di testo
                              //è arrivato alla fine
    {
      getline (myfile,line); //Dà alla string line ciò che è scritto nella riga
      
   found=line.find(obiettivo); //Cerca in line ciò che scritto in obiettivo
   if (found!=string::npos) {

//se lo trova stampa line ovvero il contatto che sta per cancellare. Poi assegna a 
//line " " e dovrebbe sovrascriverlo. Ma qui si blocca...
  
      cout<<line<<endl;
      line=" ";
      myfile << line;
      }
      
      }
   myfile.close();
    }


Cosa c'è che non va? Grazie a chiunque risponda, sto impazzendo! :blush::heehee::rofl::om::noway:
aaa
09/07/09 6:46
Pierga
Ho provato anche a metttere:
 while (! myfile.eof() )    //.eof restituisce vero quando il file di testo
                              //è arrivato alla fine
    {
      getline (myfile,line); //Dà alla string line ciò che è scritto nella riga
      
   found=line.find(obiettivo); //Cerca in line ciò che scritto in ricerca
   if (found!=string::npos) {//se lo trova stampa line. Controlla tutte le righe
                             //del file e se trova qualcosa lo stampa.
      cout<<line<<endl;
      line.erase (line.begin(), line.end()); //prima ho messo: string::iterator it;
      myfile << line;
      }
      
      }


Ho esaurito le idee...
aaa
09/07/09 8:01
theprogrammer
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.
aaa
09/07/09 8:37
Pierga
Capito, non c'è quindi altro modo?
Per forza non andava!:k::doubt:
Grazie della dritta!
aaa
09/07/09 8:45
theprogrammer
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.
aaa
09/07/09 9:37
Pierga
DB??? cos'è??? Si mangia??? :heehee:
Cmq appena riesco (per me la programmazione è un hobby quasi appena nato) modifico il programma e posto il risultato!
aaa
11/07/09 18:02
Pierga
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:
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <string>
#include <windows.h>
using namespace std;

//Funzione per spostarsi nella finestra di dialogo
void gotoxy(int x, int y) { 
for (int i = 0; i < y; i++) { 
cout<<"\n"; 
} 
for (int i = 0; i < x; i++) { 
cout<<" "; 
}
}

int main ()
{
int i=0;
gotoxy(28,2);
cout<<"Rubrica telefonica v1.0"<<endl<<endl;

//Ciclo del menù
while (i==0) {
   gotoxy(37,1);
   cout<<"Menu'"<<endl;
   gotoxy(24,0);
   cout<<"1) Inserisci un nuovo contatto.\n";
   gotoxy(24,0);
   cout<<"2) Cerca.\n";
   gotoxy(24,0);
   cout<<"3) Cancella contatto.\n";
   gotoxy(24,0);
   cout<<"4) Esci.\n"<<endl;
   cout<<"Cosa vuoi fare? ";
   cin>>i;
   while (i>4) {
         cout<<"Errore...\n"<<"Scegli l'opzione 1,2,3 o 4";
         i=0;
         }
   cout<<endl<<endl<<endl; 
   
//Inserimento dati
if(i==1) {//Se i coincide con 1, altrimenti viene assegnato ad i il valore 1!!
        ofstream myfile; //ofstream per scrivere su di un file
        myfile.open ("Rubrica.txt", ios::app); //Crea-apre il file Rubrica.txt
                                               //e parte a scrivere dalla fine
        struct tiporec          //Viene dichiarata la
        { char nome[30];        //struct e vengono
        char cognome[30];       //inserite le variabili
        char  cell[11];
        }rec;        //rec è il nome adoperato per inserire i dati nella struct
        
        
        //Inserimento dei dati
        cout<<" Nome:  ";
        cin.getline(rec.nome,30);
        cin.getline(rec.nome,30);
        cout<<" Cognome:  ";
        cin.getline(rec.cognome,30);
        cout<<" Numero telefono: ";
        cin.getline(rec.cell,11);
        cout<<endl<<endl;
        
        //Stampa nel file i dati inseriti
        myfile << rec.nome << " " << rec.cognome << " " << rec.cell << "\n";
        cout<<"Contatto inserito: "<<rec.nome<<" "<<rec.cognome<<" "<<rec.cell
        <<endl<<endl;
        myfile.close();
        i=0;
        }
 
 //Cerca contatto       
if (i==2) {//Se i coincide con 2, altrimenti viene assegnato ad i il valore 1!!
   string line, ricerca; //Diachiarazione delle due stringhe
   size_t found; //Richiamo funzione "found" per trovare un testo
   ifstream myfile; //ifstream per leggere da un file
   myfile.open ("Rubrica.txt", ios::out); //File aperto per operazioni di
                                          //output
   cout<<"Inserire parametro di ricerca: ";
   cin>>ricerca; //Ciò che si scrive viene salvato nella string ricerca
   cout<<endl<<endl;
   
   while (! myfile.eof() )    //.eof restituisce vero quando il file di testo
                              //è arrivato alla fine
    {
      getline (myfile,line); //Dà alla string line ciò che è scritto nella riga
      
   found=line.find(ricerca); //Cerca in line ciò che scritto in ricerca
   if (found!=string::npos) {//se lo trova stampa line. Controlla tutte le righe
                             //del file e se trova qualcosa lo stampa.
      cout<<line<<endl<<endl;
      }
   }
   
   cout<<"Ricerca terminata.\n";
   myfile.close();
   i=0;
    }
    
    
 //Cancellare un contatto
if (i==3) {
   string line, ricerca;
   size_t found;
   ifstream myfile;
   myfile.open ("Rubrica.txt", ios::out);
   cout<<"Inserire parametro di ricerca: ";
   cin>>ricerca;
   cout<<endl<<endl;
   
   while (! myfile.eof() )    //.eof restituisce vero quando il file di testo
                              //è arrivato alla fine
    {
      getline (myfile,line); //Dà alla string line ciò che è scritto nella riga
      
   found=line.find(ricerca);   //Cerca in line ciò che scritto in ricerca
/*Se lo trova stampa "Contatto cancellato: nome contatto". Altrimenti stampa
tutte le altre righe in un altro file ("file_trasf.txt"). Una volta letto tutto
il file Rubrica.txt e trascritto tutto tranne il contatto da cancellare in
file_trasf.txt, il programma cancella Rubrica.txt e rinomina file_trasf in 
Rubrica.txt. Risultato: l'elenco è quello di prima, ma senza il contatto che si
voleva eliminare*/                                      
   if (found!=string::npos) {
      cout<<"Contatto cancellato: "<<line<<endl<<endl;
      }
     
   else {                                         
        ofstream myfile;
        myfile.open ("file_trasf.txt", ios::app);
        myfile<<line<<"\n";
        myfile.close();
        }
      }
   myfile.close();
   remove ("Rubrica.txt");
   rename ("file_trasf.txt", "Rubrica.txt");
   i=0;
    }
 
 //Uscita dal programma   
if (i==4) {
     }
    }

return 0;
}
aaa