[C++]Modifica di un campo in un file.dat

di il
4 risposte

[C++]Modifica di un campo in un file.dat

Buonasera a tutti,
sto provando a modificare un elemento di un file dichiarato in una classe.Quando modifico il file sembra che tutto vada bene perché questa mi viene stampata a video.
Ma il problema sta quando voglio stampare tale elemento in un'altra funzione.Quando la stampo a video in altra funzione (nel mio caso la funzione è visualizza()) mi escono degli "strani" caratteri.
Secondo la mia opinione il problema sta nella modifica e in specifico nella posizione di f.write e f.read.

#include<iostream>
#include<cstring>
#include<fstream>

using namespace std;

#ifndef CLASSI_H
#define CLASSI_H

class classe{
protected:
	char nome[20];
public:
	void set_classe(char *);
	char *get_nome();
	classe(){}
	~classe(){}
};

#endif 

void classe::set_classe(char *n){
	strcpy(nome,n);
}
char *classe::get_nome(){
	return nome;
}

void carica();
void modifica();
void visualizza();

fstream f;

int main(){
	carica();
	modifica();
	visualizza();

	system("pause");
	return 0;
}

void carica(){
	classe c;
	char temp[20];

	f.open("classe.dat",ios::out|ios::binary);

	cout<<"Nome:";
	cin>>temp;
	c.set_classe(temp);
	f.write((char*)&c,sizeof(classe));

	f.close();

}

void modifica(){
	classe c;

	f.open("classe.dat",ios::out|ios::in|ios::binary);

	f.read((char*)&c,sizeof(classe));
	if(strcmp(c.get_nome(),"Antonio")==0){
		c.set_classe("Carlore");
		f.write((char*)&c,sizeof(classe));
		f.read((char*)&c,sizeof(classe));
	}


	f.close();
}

void visualizza(){
	classe c;

	f.open("classe.dat",ios::in|ios::binary);

	cout<<c.get_nome()<<endl;

	f.read((char*)&c,sizeof(classe));

	f.close();

}
Spero in un vostro aiuto.
Grazie in anticipo.







Spero che possiate aiutarmi.

4 Risposte

  • Re: [C++]Modifica di un campo in un file.dat

    Forse è solo perchè stampi a video prima di aver letto da file
    Prova così
    
    void visualizza()
    {
       classe c;
       f.open("classe.dat",ios::in|ios::binary);
       f.read((char*)&c,sizeof(classe));
       cout<<c.get_nome()<<endl;
       f.close();
    }
    
  • Re: [C++]Modifica di un campo in un file.dat

    Ho provato ma ancora niente.Dovrebbe stampare la modifica ("Carlore") ma stampa il nome digitato ("Antonio").
  • Re: [C++]Modifica di un campo in un file.dat

    Ti consiglio di verificare con un editor il contenuto del file .dat dopo la scrittura; probabilmente eseguendo una serie di read() e write() hai spostato il puntatore di posizione all'interno del file.
    Se è questo il problema, prima di fare f.write() dovresti forse fare un fseek() (credo seekp() se usi fstream) per rispostarti all'inizio del file.
  • Re: [C++]Modifica di un campo in un file.dat

    Ho inserito f.seekp(0,ios::beg) prima di f.write e ora va tutto bene.Grazie mille.
Devi accedere o registrarti per scrivere nel forum
4 risposte