[C++]Cancellazione fisica

di il
4 risposte

[C++]Cancellazione fisica

Buongiorno a tutti,
sto cercando di capire come posso sviluppare un algoritmo per la cancellazione fisica di dati all'interno di un file.
Ho pensato di creare un secondo file in cui scrivere i dati da non cancellare e in seguito cancellare il file originario e rinominare il secondo file con il nome del primo.
Ma purtroppo quest'ultimo non funziona e non capisco cosa ho sbagliato.
Chiedo il vostro aiuto nel capire dov'è l'errore.
Grazie in anticipo.
Vi posto il codice:
 
#include<iostream>
#include<fstream>
#include<cstdio>

using namespace std;

#ifndef CLASSI_H
#define CLASSI_H

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

#endif 

void classe::set_nome(char *n){
	strcpy(nome,n);
}

char *classe::get_nome(){
	return nome;
}

fstream f;
fstream g;

const int N=2;

void caricamento();
void cancellazione();
void visualizza();

int main(){
	caricamento();
	cancellazione();
	visualizza();

	system("pause");

	return 0;
}

void caricamento(){
	classe c;
	long pos;
	char temp [20];

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

	if(f.fail()==false){
		for(int i=0;i<N;i++){
			pos=i*sizeof(classe);
			f.seekg(pos,ios::beg);
			cout<<"Nome:";
			cin>>temp;
			c.set_nome(temp);
			f.seekp(pos,ios::beg);
			f.write((char*)&c,sizeof(classe));
		}
		f.close();
		cout<<endl;
	}

}
void cancellazione(){
	classe c;

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

	for(int i=0;i<N;i++){
		f.read((char*)&c,sizeof(classe));
		if(!strcmp(c.get_nome(),"Michele")){
			g.write((char*)&c,sizeof(classe));
		}
	}

	f.close();
	g.close();

	remove("classe.dat");
	rename("classe1.dat","classe.dat");
}

void visualizza(){
	classe c;

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

	if(f.fail()==false){
		for(int i=0;i<N;i++){
			f.read((char*)&c,sizeof(classe));
			cout<<"Nome:"<<c.get_nome()<<endl;
		}
		f.close();
	}
}

4 Risposte

  • Re: [C++]Cancellazione fisica

    Ti suggerisco, per farla più semplice, di inserire una flag che indica se il record è valido oppure no, così eviti di dover cancellare fisicamente.
    Tornando al tuo problema, cos'è che di preciso non funziona? Se commenti la remove() e la rename() ti viene correttamente creato il file classe1.dat con i dati che ti aspetti?
  • Re: [C++]Cancellazione fisica

    Non riesco a stampare i dati rimasti nel file.
    Per esempio inserisco inizialmente i nomi Michele e Antonio.Il primo dovrebbe rimanere nel file classe.dat (nell'if ho posto questo) mentre Antonio dovrebbe spostarsi nella classe1.dat e in seguito la classe.dat deve essere cancellata(remove) mentre la classe1.dat viene rinominata (rename) in classe.dat.Ma tutto cio' non avviene perchè mi viene stampato a video due volte il nome Michele.
    Per il suo consiglio con il valore di ritorno in questo modo considero una cancellazione logica?
  • Re: [C++]Cancellazione fisica

    
    void cancellazione(){
    	classe c;
    	int flag;
    
    	flag=0;
    
    	f.open("classe.dat",ios::in|ios::out|ios::binary);
    
    	for(int i=0;i<N;i++){
    		f.read((char*)&c,sizeof(classe));
    		if(strcmp(c.get_nome(),"Michele")==0){
    			flag=1;
    			c.set_nome("");
    			f.seekp(0,ios::beg);
    			f.write((char*)&c,sizeof(classe));
    		}
    	}
    
    	f.close();
    }
    
    Questa è la funzione funzionante che lei mi ha consigliato.
    Mi farebbe piacere avere dei chiarimenti anche su quella precedente così da poter avere una conoscenza maggiore.
  • Re: [C++]Cancellazione fisica

    Flag (che io rinominerei in valid ad esempio) deve essere un membro della classe, in maniera tale che venga aggiornato anche su file.
Devi accedere o registrarti per scrivere nel forum
4 risposte