PDA

Visualizza la versione completa : [C++] modifica file


Salvatore_91
07-03-2009, 21:22
ciao raga, mi potreste aiutare??
Questo mio programma, dovrebbe gestire una rubrica ( e' solo un inizio per adesso).
Funziona, va' tutto bene, il problema avviene quando, voglio fare la modifica, Inserendo '5'.
Dopodiche', viene chiesto di inserire il numero della persona, il campo da modificare, e la parola modificata.
Una volta inserito questi dati, il programma scrive su file, ma non mi rispetta il tracciato record, viene scritta la parola modificata, ma sfasata.


# include <iostream>
# include <windows.h>
# include <string>
# include <fstream>
# include <sstream> //per la funzione stringstream
using namespace std;

string nome, cogn, numero, mail, modif;
string linea;
long pos;
int i,Num;

void acquis_scritt(ofstream &write);
void leggi_stampa();
int conta_righe();

int main()
{
int scelta, Nriga, opz;
char ok;
cout << "RUBRICA telefonica\n"<<endl;

while (scelta!=6)
{
cout << "1) Inizia Rubrica " << endl;
cout << "2) Aggiungi Contatti " << endl;
cout << "3) Visualizza contatti " << endl;
cout << "4) Elimina Rubrica " << endl;
cout << "5) Modifica contatti" << endl;
cout << "6) Esci" << endl;
cin >> scelta;

if (scelta==1)
{
ofstream write("Rubrica.txt",ios::out);
write << "N";
write.seekp (5, ios_base::beg);
write << "NOME";
write.seekp (25, ios_base::beg);
write <<"COGNOME";
write.seekp (45, ios_base::beg);
write <<"NUMERO";
write.seekp (57, ios_base::beg);
write <<"E-MAIL"<<endl;
Num=1;
acquis_scritt(write);
write.close();
}
if (scelta==2)
{
ofstream write("Rubrica.txt",ios::app);
Num=conta_righe();
acquis_scritt(write);
write.close();
}
if (scelta==3)
{
leggi_stampa();
}
if (scelta==4)
{
cout << "Sei sicuro di voler eliminare la rubrica? (s/n)" << endl;
cin >> ok;
if (ok=='s' || ok=='S')
{
ofstream remove("Rubrica.txt");
remove.close();
cout << "Rubrica Eliminata!! "<<endl;
}
}
if (scelta==5)
{
leggi_stampa();
cout << "Inserisci il numero corrispondente alla personona" << endl;
cin >> Nriga;
cout << "Inserisci '1' per il nome" << endl;
cout << "Inserisci '2' per il cognome" << endl;
cout << "Inserisci '3' per il numero" << endl;
cout << "Inserisci '4' per l'e-mail" << endl;
cin >> opz;
cout << "Inserisci il campo modificato" << endl;
cin >> modif;
fstream r_w("Rubrica.txt",ios::in | ios::out);
if(r_w)
{
for(i=1;i<=Nriga;i++)
r_w >> linea;
}
switch (opz)
{
case 1:
r_w.seekp (5, ios_base::cur);
modif.resize(20);
r_w << modif;
break;
case 2:
r_w.seekp (25, ios_base::cur);
modif.resize(20);
r_w << modif;
break;
case 3:
r_w.seekp (45, ios_base::cur);
modif.resize(12);
r_w << modif;
break;
case 4:
r_w.seekp (57, ios_base::cur);
modif.resize(35);
r_w << modif;
break;
}
r_w.close();
}

if (scelta!=3)
system("CLS");
}
cout << "Sei uscito dal programma." <<endl;
system("PAUSE");
}
//------------------------------------------------------------------------------
void acquis_scritt(ofstream &write)
{
//////////////////////////// Scrive il contenuto di variabile
stringstream s; // intera su file di 5 byte
string ss; //
s << Num; //
ss = s.str(); //
ss.resize(5); //
write <<ss; //
/////////////////////
cout << "Inserisci nome:"<<endl;
cin >> nome;
nome.resize(20);
write << nome;

cout << "Inserisci cognome:"<<endl;
cin >> cogn;
cogn.resize(20);
write << cogn;

cout << "Inserisci numero:"<<endl;
cin >> numero;
numero.resize(12);
write << numero;

cout << "Inserisci e-mail:"<<endl;
cin >> mail;
mail.resize(35);
write << mail << endl;
}
//------------------------------------------------------------------------------
void leggi_stampa()
{
system("CLS");
int rig = conta_righe();
ifstream read("Rubrica.txt");
if(read)
{
for(i=1;i<=rig;i++)
{
read >> linea;
cout << linea <<endl;
}
}
read.close();
}
//------------------------------------------------------------------------------
// CONTA RIGHE
int conta_righe()
{
fstream file;
string s;
int contarighe=0;
file.open("Rubrica.txt",ios::in);
if(file)
{
while(!file.eof())
{
getline(file,s,'\n');
contarighe++;
}
}
return contarighe-1;
}

Salvatore_91
07-03-2009, 22:06
Quando eseguo la modifica del FILE rubrica,
funziona perfettamente, solo per modifiche della seconda riga, per il resto (delle modfiche), il programma mi scrive sul File sfasato.

oregon
07-03-2009, 22:06
Devi considerare i due caratteri cr lf alla fine della riga precedente e quindi aumentare di 2 i valori della seekp. Devono diventare 7, 27, 47, 59

Salvatore_91
07-03-2009, 22:07
si, ma allora perche' quando eseguo le modifiche sulla seconda riga, mi funziona perfettamente??
non capisco??

oregon
07-03-2009, 22:16
Originariamente inviato da Salvatore_91
si, ma allora perche' quando eseguo le modifiche sulla seconda riga, mi funziona perfettamente??
non capisco??

La seconda riga? Fai un esempio concreto ...

Salvatore_91
07-03-2009, 22:23
Cioe':
N () NOME ecc
1 ( ) salvatore ecc
2 ( ) maria ecc.

se faccio modifiche a 'Maria', che si trova nella seconda riga, il programma funziona perfettamente, mentre se faccio modifiche a 'Salvatore' , il programma mi scrive sfasato:
in questo modo:
Se prima era cos:
N () NOME ecc
1 ( ) salvatore ecc
2 ( ) maria ecc.

dopo la modifica al 'nome' della prima riga (cioe' a salvatore),
viene: (presumendo che la parola modificata inserita sia 'SALVATORE' in maiuscolo.
N () NOME ecc
1 ( ) sSALVATORE ecc
2 ( ) maria ecc.

oregon
07-03-2009, 22:38
Ho fatto la prova sulla prima e sulla seconda riga e funziona ugualmente, dopo le modifiche che ti ho detto ...

Salvatore_91
07-03-2009, 22:40
bhe, se lo dici tu!,
ma dove le devo fare queste modifiche??? nei seekp dello switch???

oregon
07-03-2009, 22:42
Originariamente inviato da Salvatore_91
bhe, se lo dici tu!,
ma dove le devo fare queste modifiche??? nei seekp dello switch???

Ah ... non le hai ancora fatte?

Se non provi le modifiche che ti vengono suggerite, a cosa serve rispondere?

Salvatore_91
07-03-2009, 22:44
si, ho provato a farle, (le modifiche delle seekp nello swtich), ma non funzionava, per questo ti chiedevo...

Loading