salve a tutti, sono nuovo avevo già cercato aiuto in altri forum ma con pochi risultati, ho un programmino per salvare varie password, ho un problema nella fase di modifica (funzione void modifica() ) dei record..invece di modificarli mene crea un'altro.....grazie in anticipo allego il sorgente
codice:
#include<iostream>#include<fstream>
#include<string.h>
#include <stdio.h>
using namespace std;
int indice();
void modifica();
void lista();
void inserisci();
void cerca();
//string scrivi();
struct account{
int indice;
char nsito[50];
char nutente[20];
char psw[30];
};
struct account nuovo;
ofstream of;
ifstream ifs;
char menu;
int main () {
int ctrl,scelta,ctrl2;
char sbagliato, mod;
string psw;
sbagliato:
cout<<"inserisci la password:"; // psw per acceddere al programma
cin>>psw;
if(psw!="password"){
cout<<"password sbagliata!!!!!! riprovare"<<endl;
goto sbagliato;
}
menu:
system("cls"); //menu
cout<<"benvenuto in gestione psw, cosa vuoi fare?\n";
cout<<" 1) visualizzare| modificare gli account in memoria \n";
cout<<" 2) aggiungere un nuovo account\n";
cout<<" 3) uscire \n";
cout<<" digitare 1 2 o 3 e premere invio! :";
cin>> scelta;
if (scelta==1) {
lista();
cout<<"vuoi modificare/cercare un account?(s=modifica/c=cerca/n=menu/x=uscita)"<<endl;
cin>>mod;
if(mod=='s'){
modifica();
cout<<"premere 1 per tornare al menu o premere 0 per uscire";
cin>>ctrl2;
if(ctrl2==1) goto menu;
else return 0;
}else if(mod=='n'){
goto menu;
}else if(mod=='x'){
return 0;
}else if(mod=='c'){
cerca();
}
}else if (scelta==2){
do{
nuovo.indice=indice();
cout<<"inserisci nome del sito(senza spazi): ";
cin>>nuovo.nsito;
cout<<"\n inserisci nome utente: ";
cin>>nuovo.nutente;
cout<<"\n inserisci la password del sito: ";
cin>>nuovo.psw;
ofstream of("pswww.txt", ios::app| ios::out | ios::binary);
of.write((char *) &nuovo, sizeof(struct account));
cout<<"\n inserire un altro account?(1=si/2=no(torna al menu)):";
cin>>ctrl;
}while(ctrl!=2);
of.close();
goto menu;
}
return 0;
}
int indice(){
int a;
ifstream ifs("pswww.txt", ios::in | ios::binary);
while(ifs.read((char *) &nuovo, sizeof(struct account))){
a=nuovo.indice+1;
}
if(a<1 ) a=1;
return a;
}
void modifica(){
int temp,unodue;
char temputente[20];
cout<<"digitare l'indice dell'account da modificare"<<endl;
cin>>temp;
system("cls");
fstream ifs("pswww.txt", ios::in | ios::out | ios::binary);
while(ifs.read((char *) &nuovo, sizeof(struct account))){ // qui c'è il problema da qualche parte:(
if(temp==nuovo.indice){
cout<<nuovo.indice<<") "<<nuovo.nsito<<" -- "<<nuovo.nutente<<" -- "<<nuovo.psw;
cout<<"cosa vuoi modificare?(1: nomeutente, 2: password)";
cin>>unodue;
if(unodue==1){
cout<<"inserisci un nuovo nutente: ";
cin>>nuovo.nutente;
}
if(unodue==2){
cout<<"inserisci la nuova password:";
cin>>nuovo.psw;
}
ifs.write((char *) &nuovo, sizeof(struct account));
break;
}
}
ifs.close();
cout<<"modifica effettuata!"<<endl;
}
void lista(){ // visualizzo lista
ifstream ifs("pswww.txt", ios::in | ios::binary);
while(ifs.read((char *) &nuovo, sizeof(struct account))){
cout<<nuovo.indice<<") "<<nuovo.nsito<<" -- "<<nuovo.nutente<<" -- "<<nuovo.psw<<endl;
}
ifs.close();
}
void cerca(){
char sito[50];
int i;
char * pch;
cout<<"inserisci in nome del sito da cercare:"<<endl;
cin>>sito;
ifstream ifs("pswww.txt", ios::in | ios::binary);
while(ifs.read((char *) &nuovo, sizeof(struct account))){
while((pch=strstr(nuovo.nsito,sito))!=NULL){ //strstr(x,y) cerca y in x se la trova punta alla prima corrispendenza, altrimenti il puntatore a valore null
cout<<"trovato: "<<nuovo.indice<<") "<<nuovo.nsito<<" -- "<<nuovo.nutente<<" -- "<<nuovo.psw<<endl;
break;
}
}
ifs.close();
}