PDA

Visualizza la versione completa : [c++] eliminare un record da un file


theboss280489
16-03-2010, 15:38
Salve ragazzi
facendo un po di ricerche nel forum e su internet non sono riuscito a trovare una funzione in c++ che mi elimini una riga da un file senza riscriverlo completamente trascurando la linea che non vogliamo cancellare.
Cioè non esiste una funzione tipo quella di php

$query = mysql_query("DELETE FROM tabella WHERE nome = gianni");
Potete confermare questa mia ricerca?

Ora vorrei sapere come posso farlo riscrivendo il file e utilizzando i vector.
vi posto il codice che sono riuscito a scrivere ma non funziona bene poichè cancella tutto il file o meglio non lo riscrive.
Questa è la mia classe:


#include <iostream>
#include <string>
using namespace std;
class squadre {
//definisco gli attributi relativi alla classe
string nome;
int giocate;
int vinte;
int perse;
int pari;
int gf;
int gs;
int penalita;
public:
//definizione dei vari metodi della classe
//Costruttore di default
squadre() {
nome = "";
giocate = 0;
vinte = 0;
perse = 0;
pari = 0;
gf = 0;
gs = 0;
penalita = 0;
}
//Costruttore
squadre (string name, int played, int won, int lost, int drawn, int scored, int conceded, int penality) {
nome = name;
giocate = played;
vinte = won;
perse = lost;
pari = drawn;
gf = scored;
gs = conceded;
penalita = penality;
}
//Distruttore
~squadre() {
cout << "Libero la memoria occupata...";
}
//Prototipi dei vari metodi sulla classe (definizione trattata successivamente)
void elimina();
};


E questa è la definizione del metodo elimina:


void squadre::elimina(){
//Puntatore al file
FILE *filepunt;
if((filepunt = fopen("squadre.dat","rb"))==NULL)
{
//Il file non esiste non posso eliminare nessuna squadra
//Restituisco un messaggio di errore
cout << "\n Il file 'squadre.dat' e' inesistente.\nNon e' stata inserita nessuna squadra!";
} else {
//il file è stato aperto precedentemente. Chiedo all'utente il nome della squadra da eliminare
cout << "Inserisci il nome della squadra da eliminare\n";
//creo una variabile locale per il nome e una per definire se esiste una squadra con quel nome
int trovato=0;
string nome_temp;
cin >> nome_temp;
//verifico se effettivamente il nome inserito esiste
while(fread (this,sizeof(*this),1,filepunt) && !feof(filepunt))
{
if(nome == nome_temp)
{
cout << "Trovata 1 squadra con il nome inserito: ";
//Stampo i titoli delle colonne
cout << "Nome";
cout << "\tGiocate";
cout << "\tVinte";
cout << "\tPerse";
cout << "\tPari";
cout << "\tFatti";
cout << "\tSubiti";
cout << "\tPenalita'";
cout << "\n" << endl;
cout << nome;
cout << "\t" << giocate;
cout << "\t" << vinte;
cout << "\t" << perse;
cout << "\t" << pari;
cout << "\t" << gf;
cout << "\t" << gs;
cout << "\t" << penalita;
cout << endl << endl;
trovato = 1;
break;
}
}

if(trovato==1) {
vector<squadre> vect;
//inserisco nel vector tutti gli elementi tranne quello da eliminare
while(fread (this,sizeof(*this),1,filepunt) && !feof(filepunt))
{
if(nome != nome_temp)
{ vect.push_back(*this);}
}
//chiudo il file e lo apro in modalita scrittura cancellando ogni dato sul file
fclose(filepunt);
filepunt = fopen("squadre.dat","wb");
//inserisco gli elementi del vector all'interno del file
vector<squadre>::iterator iter;
for(iter = vect.begin(); iter != vect.end(); iter++){
fwrite(this, sizeof(*this), 1, filepunt);
}

} else {
cout << "Non esiste nessuna squadra con questo nome!";
}
fclose(filepunt);
}
}

Che errore ho commesso?
Grazie

antotan
16-03-2010, 18:14
Ciao, non ho tempo purtroppo di guardare il codice ma:



$query = mysql_query("DELETE FROM tabella WHERE nome = gianni");


riguarda l'esecuzione di una query su un database.
Tu non usi un database, quindi non puoi fare una cosa del genere.

Se hai necessità di utilizzare le funzionalità di un database e vuoi farla semplice, potresti utilizzare SQLite, che mi pare adatto al tuo scopo.

:ciauz:

theboss280489
16-03-2010, 18:20
Era un esempio quello del codice per indicare che un comando cosi non c'è.
Ma mi interessa maggiormente sapere perchè la riscrittura con vector non funziona. Molto probabilmente ho solo commesso piccoli errorini logici visto che lo script non mi da errori.
Potresti aiutarmi a risolverli? Grazie

theboss280489
17-03-2010, 16:04
Ragazzi nessuno mi da una mano??? UPP :(

oregon
17-03-2010, 16:21
E' inutile che cerchi ... devi leggere, eliminare, riscrivere ...

theboss280489
17-03-2010, 16:22
Originariamente inviato da oregon
E' inutile che cerchi ... devi leggere, eliminare, riscrivere ...
In che senso?

oregon
17-03-2010, 16:27
Originariamente inviato da theboss280489
In che senso?

"senza riscriverlo completamente trascurando la linea che non vogliamo cancellare"

... devi fare così.

theboss280489
17-03-2010, 16:31
Originariamente inviato da theboss280489
Era un esempio quello del codice per indicare che un comando cosi non c'è.
Ma mi interessa maggiormente sapere perchè la riscrittura con vector non funziona. Molto probabilmente ho solo commesso piccoli errorini logici visto che lo script non mi da errori.
Potresti aiutarmi a risolverli? Grazie
Ma perché dai queste riposte da intenditore? Leggi le discussioni prima di dare una risposta ed è gia la seconda volta che scrivi una cosa del genere nei miei confonti e mi fai passare per pazzo.
Ti rispiego passo passo quello che ho scritto.

Era un esempio quello del codice per indicare che un comando cosi non c'è.
quindi quel comando era un esempio: sono consapevole che quel comando non esista!

Ma mi interessa maggiormente sapere perchè la riscrittura con vector non funziona. Molto probabilmente ho solo commesso piccoli errorini logici visto che lo script non mi da errori.
Potresti aiutarmi a risolverli?
quindi non mi interessa quel comando ma sono interessato al fatto che la vectorn non funziona!!!!!
Quindi prima di scrivere quelle conclusioni da intenditore cerca di leggere il post.
GRAZIE!

oregon
17-03-2010, 16:35
Ma cosa vuoi? :confused:


Stai rispondendo a me o ad antotan ?

theboss280489
17-03-2010, 16:36
Semplicemente a te.

Loading