PDA

Visualizza la versione completa : [C++] Archivi, modifica di un campo di un record


aldo123
14-12-2012, 21:20
Scusate per il post di prima, ma i miei mi reclamavano per andare a cenare D:

Volevo comunque dire che, quando lancio il programma, l'inserimento dei dati e la stampa funziona, ma c'è un problema nella modifica. Riesce a trovare il campo da modificare, mi fa inserire il nuovo campo che dovrebbe sostituire quello precedente ma non me lo modifica...

Sto impazzendo e non riesco a risolvere il problema, qualcuno può aiutarmi? Grazie in anticipo!

CODICE:
*Non riesco ad inserirlo in modo corretto, non so il perché*


#include <iostream>
#include <stdio.h>

using namespace std;

struct lazio {
char nome [30];
};

int menu ();

void inserimento ();
void modifica ();
void stampa ();
//------------------------------- main ----------------------------------------
int main()
{
int s;
do {
s=menu();
switch (s) {
case 1: inserimento (); break;
case 2: modifica (); break;
case 3: stampa (); break;
case 4: cout<<" "<<endl;
}
} while (s!=4); return 0;
}
int menu ()
{
int scelta;
cout<<"1 Inserimento "<<endl;
cout<<"2 Modifica "<<endl;
cout<<"3 Stampa "<<endl;
cout<<"4 Exit "<<endl;
cout<<" Scelta -> ";

cin>>scelta;

return scelta;
}

void inserimento ()
{
FILE *fp;
lazio x;

fp=fopen("Lazio.dat","a+b"); //Apertura file

cout<<"Nome: ";
cin>>x.nome;

fwrite (&x, sizeof(lazio), 1, fp); //Scrittura nel file

fclose (fp);//Chiusura File
}
void modifica ()
{
FILE *fp;
lazio x;
char y[30];
int k=0;
int z=-1;

cout<<"Inserire un nome: ";
cin>>y; //Variabile che si confronterà con quella del file

fp=fopen("Lazio.dat", "r+b"); //Apertura File
while ( fread ( &x, sizeof (lazio), 1, fp ) ) //Ciclo che legge tutto il file
{
if ( strcmp (y,x.nome)==0 )
{
cout<<"Nuovo nome: ";
cin>>x.nome;

fwrite (&x, sizeof(lazio), 1, fp); //Scriviamo sul File
fseek(fp, z, SEEK_CUR);
k++; //Dopo aver trovato il nome, incrementiamo questa variabile per il controllo se qualcosa è stato modificato o meno
}
}
if (k==0) cout<<"Nome non trovato."<<endl;

fclose (fp);
}

void stampa ()
{
FILE *fp;
lazio x;

fp=fopen("Lazio.dat", "rb"); //Apertura File

while ( fread ( &x, sizeof (lazio), 1, fp ) )
{
cout<<"Nome: "<<x.nome<<endl;
}
fclose (fp);
}

Scara95
14-12-2012, 22:20
Sovrascrivi la struttura successiva: dopo aver letto una struttura la posizione sul file segue questa struttura, per sovrascrivere la struttura che hai appena letto devi tornare indietro della grandezza di una struttura e posizionarti nel punto corretto.

Inoltre stai scrivendo dei puntatori a carattere e non i caratteri veri e propri percui se rileggi lo stesso file in un'altra sessione il puntatore punterà in un area di memoria indefinita...

aldo123
14-12-2012, 22:54
Il tornare indietro l'ho fatto con l'fseek prima dell'fwrite...
L'unica cosa che non capisco è la seconda parte del tuo messaggio...
Non so veramente cosa fare xD ( e non è un mio merito )...

aldo123
14-12-2012, 22:59
Ho provato prima a far fermare il file appena trovava il nome che gli volevo far modificare, poi vari cin e cout, di nuovo fseek per salire di un record e poi fwrite, ma mi ripete la riga "
cout<<"Nuovo nome: ";
cin>>x.nome;
"
Fino all'infinito...

aldo123
14-12-2012, 23:04
La nuova codifica, comunque sbagliata...


#include <iostream>
#include <stdio.h>

using namespace std;

struct lazio {
char nome [30];
};

int menu ();

void inserimento ();
void modifica ();
void stampa ();
//------------------------------- main ----------------------------------------
int main()
{
int s;
do {
s=menu();
switch (s) {
case 1: inserimento (); break;
case 2: modifica (); break;
case 3: stampa (); break;
case 4: cout<<" "<<endl;
}
} while (s!=4); return 0;
}
int menu ()
{
int scelta;
cout<<"1 Inserimento "<<endl;
cout<<"2 Modifica "<<endl;
cout<<"3 Stampa "<<endl;
cout<<"4 Exit "<<endl;
cout<<" Scelta -> ";

cin>>scelta;

return scelta;
}

void inserimento ()
{
FILE *fp;
lazio x;

fp=fopen("Lazio.dat","a+b"); //Apertura file

cout<<"Nome: ";
cin>>x.nome;

fwrite (&x, sizeof(lazio), 1, fp); //Scrittura nel file

fclose (fp);//Chiusura File
}
void modifica ()
{
FILE *fp;
lazio x;
char y[30];
int k=0;
int z=-1;

cout<<"Inserire un nome: ";
cin>>y; //Variabile che si confronterà con quella del file

fp=fopen("Lazio.dat", "r+b"); //Apertura File
while ( fread ( &x, sizeof (lazio), 1, fp ) ) //Ciclo che legge tutto il file
{
if ( strcmp (y,x.nome)==0 )
{

fseek (fp, 0, SEEK_CUR);

cout<<"Nuovo nome: ";
cin>>x.nome;
fseek(fp, z, SEEK_CUR);
fwrite (&x, sizeof(lazio), 1, fp); //Scriviamo sul File
k++; //Dopo aver trovato il nome, incrementiamo questa variabile per il controllo se qualcosa è stato modificato o meno
}
}
if (k==0) cout<<"Nome non trovato."<<endl;

fclose (fp);
}

void stampa ()
{
FILE *fp;
lazio x;

fp=fopen("Lazio.dat", "rb"); //Apertura File

while ( fread ( &x, sizeof (lazio), 1, fp ) )
{
cout<<"Nome: "<<x.nome<<endl;
}
fclose (fp);
}

Scara95
15-12-2012, 10:24
#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

struct lazio {
char nome [30];
};

const size_t lazio_size = sizeof(char) * 30;
const size_t lazio_nome_size = sizeof(char) * 30;

void write_struct(lazio *x, FILE *fp);
size_t read_struct(lazio *x, FILE *fp);
void back_one_struct(FILE *fp);

int menu ();

void inserimento ();
void modifica ();
void stampa ();
//------------------------------- main ----------------------------------------
int main()
{
int s;
do {
s=menu();
switch (s) {
case 1: inserimento (); break;
case 2: modifica (); break;
case 3: stampa (); break;
case 4: cout<<" "<<endl;
}
} while (s!=4); return 0;
}
int menu ()
{
int scelta;
cout<<"1 Inserimento "<<endl;
cout<<"2 Modifica "<<endl;
cout<<"3 Stampa "<<endl;
cout<<"4 Exit "<<endl;
cout<<" Scelta -> ";

cin>>scelta;

return scelta;
}

void inserimento ()
{
FILE *fp;
lazio x;

fp=fopen("Lazio.dat","a+b"); //Apertura file

cout<<"Nome: ";
cin>>x.nome;

write_struct(&x, fp); //Scrittura nel file

fclose (fp);//Chiusura File
}
void modifica ()
{
FILE *fp;
lazio x;
char y[30];
int k=0;
int z=-1;

cout<<"Inserire un nome: ";
cin>>y; //Variabile che si confronterà con quella del file

fp=fopen("Lazio.dat", "r+b"); //Apertura File
while ( read_struct(&x, fp) ) //Ciclo che legge tutto il file
{
if ( strcmp (y,x.nome)==0 )
{
cout<<"Nuovo nome: ";
cin>>x.nome;

back_one_struct(fp);
write_struct(&x, fp);

k++; //Dopo aver trovato il nome, incrementiamo questa variabile per il controllo se qualcosa è stato modificato o meno
}
}
if (k==0) cout<<"Nome non trovato."<<endl;

fclose (fp);
}

void stampa ()
{
FILE *fp;
lazio x;

fp=fopen("Lazio.dat", "rb"); //Apertura File

while ( read_struct(&x, fp) )
{
cout<<"Nome: "<<x.nome<<endl;
}
fclose (fp);
}


void write_struct(lazio *x, FILE *fp) {
fwrite(x->nome, lazio_nome_size, 1, fp);
}
size_t read_struct(lazio *x, FILE *fp){
return fread(x->nome, lazio_nome_size, 1, fp);
}
void back_one_struct(FILE *fp){
fseek(fp, -lazio_size, SEEK_CUR);
}

Così dovrebbe funzionare, anche se non ne ho la certezza in quanto non ho un compilatore C++...

Loading