View Full Version : c++
Avrei 2 cose da chiedervi:
per effettuare la cancellazione di una struct in un file devo aprirlo con r+?
char vuoto[]=" ";
FILE *stream =fopen("text.txt","r+");
ricerca registrazione
---
---
strcpy(rec.nome,vuoto);
strcpy(rec.cognome,vuoto);
fwrite(&rec,sizeof(rec),1,stream);
dovrebbe essere cosi pero' non funziona...
la registrazione rimane li.
poi se voglio scorrere un file di testo fino ad eof come faccio?
ho provato
while(!=EOF) ma non funziona
Grazie anticipatamente
ilsensine
02-03-2005, 14:07
Originariamente inviato da gio84
FILE *stream =fopen("text.txt","r+");
ricerca registrazione
---
---
strcpy(rec.nome,vuoto);
strcpy(rec.cognome,vuoto);
fwrite(&rec,sizeof(rec),1,stream);
dovrebbe essere cosi pero' non funziona...
Dovrebbe essere così e dovrebbe funzionare
poi se voglio scorrere un file di testo fino ad eof come faccio?
ho provato
while(!=EOF) ma non funziona
while(fread(buff, e_size, n_elem, stream)>0) {
...
}
eh ma la cancellazione non funziona....
ilsensine
02-03-2005, 14:48
"non funziona" non consente di identificare dove possa essere l'errore (potrei benissimo risponderti..."a me funziona" :D ). Se puoi fare un programmino di test in grado di riprodurre il problema sarebbe l'ideale.
Ecco:
FILE *stream=fopen("text.txt","r+");
printf("Inserisci il Cogome ");
gets(cognome);
printf("Inserisci il Nome ");
gets(nome);
while(fread(&bu,sizeof(bu),1, stream)>0)
{
if ((strcmp(bu.cognome,cognome)==0) && (strcmp(bu.nome,nome)==0))
{
cout<<endl; c
cout<<endl;
cout<<"Cognome "<<bu.cognome<<" ";
cout<<"Nome "<<bu.nome<<" ";
cout<<"Telefono "<<bu.num<<" ";
cout<<"Cellulare"<<bu.cell<<" ";
cout<<"Via/Piazza "<<bu.indirizzo.indiri;
cout<<" num "<<bu.indirizzo.n<<endl;
cout<<endl;
printf("Vuoi cancellare questa Id? s/n ");
gets(s);
if(s[0]=='s')
{
strcpy(bu.nome,vuoto);
strcpy(bu.cognome,vuoto);
strcpy(bu.cell,vuoto);
strcpy(bu.indirizzo.indiri,vuoto);
strcpy(bu.num,vuoto);
strcpy(bu.indirizzo.n,vuoto);
fwrite(&bu,sizeof(bu),1,stream);
}//chiude il secondo if che chiede la cancellazione
}//chiude il primo if verifica il nome e cognome
} //chiusura while
fflush(stream);
fclose(stream);
un'altra domanda, posso dichiarare un file nel main e poi passarlo come parametro in una prcedura mi conviene?
Se si qual'è la sintassi?
ilsensine
02-03-2005, 15:32
Il tuo codice bene che vada cancella il record successivo a quello desiderato...devi effettuare una fseek(stream, -sizeof(bu), SEEK_CUR); prima della fwrite, per riposizionare correttamente il file pointer.
un'altra domanda, posso dichiarare un file nel main e poi passarlo come parametro in una prcedura mi conviene?
Puoi passarlo come parametro "const char *". E' questo che intendi?
void fnc(const char *fname) {
FILE *f = fopen(fname, "r+");
...
}
int main(void) {
const char *fname = "prova.txt";
fnc(fname);
...
}
eh già avevo provato pero' non funziona lo stesso , la registrazione rimane all'interno del file.
X quanto riguarda il passaggio del file come parametro, l'unica cosa che posso fare è quella di passare il nome del file come costante?
ma alla fine il file dovrà sempre essere dichiarato all'interno di ogni funzione?
Se ho capito bene il c++ gestisce i file direttamente con nome fisico e non logico come pascal ed altri linguaggi...
ilsensine
02-03-2005, 15:45
Originariamente inviato da gio84
eh già avevo provato pero' non funziona lo stesso , la registrazione rimane all'interno del file.
Logicamente è corretto; controlla di passare i parametri corretti alla fseek (occhio al "-" prima di sizeof(bu) -- devi tornare indietro di un record)
X quanto riguarda il passaggio del file come parametro, l'unica cosa che posso fare è quella di passare il nome del file come costante?
ma alla fine il file dovrà sempre essere dichiarato all'interno di ogni funzione?
Se ho capito bene il c++ gestisce i file direttamente con nome fisico e non logico come pascal ed altri linguaggi...
Non ti capisco...se passi il nome del file come parametro alla funzione, non devi ridichiararlo dentro la funzione
ho messo il "-" ed ora funziona.
Bisogna metterlo perchè dopo l'istruzione fread passa automaticamente avanti?
come parametro cosi passi solo il nome del file cioè text.txt ma comunque nella funzione devi sepre dichiarare :
FILE *STREAM = fopen(costantepassata ....
ilsensine
02-03-2005, 16:40
Originariamente inviato da gio84
ho messo il "-" ed ora funziona.
Bisogna metterlo perchè dopo l'istruzione fread passa automaticamente avanti?
Bè certo, forse che tra una fread e la successiva il file pointer avanza con la forza del pensiero? :D
come parametro cosi passi solo il nome del file cioè text.txt ma comunque nella funzione devi sepre dichiarare :
FILE *STREAM = fopen(costantepassata ....
Ah ho capito; puoi passare lo stream aperto allora:
void fnc(FILE *stream) {
...
}
int main(void) {
FILE *stream = fopen("prova.txt", "r+");
fnc(stream);
...
}
Attento a non impappinarti con la posizione nel file; se una specifica funzione richiede che il file pointer stia ad es. all'inizio o alla fine dello stream, e lo stream è stato già utilizzato da qualche altra parte, dovresti riposizionarlo esplicitamente con una fseek.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.