|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Jan 2005
Messaggi: 199
|
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 |
![]() |
![]() |
![]() |
#2 | ||
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Re: c++
Quote:
Quote:
... }
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
||
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Jan 2005
Messaggi: 199
|
eh ma la cancellazione non funziona....
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
"non funziona" non consente di identificare dove possa essere l'errore (potrei benissimo risponderti..."a me funziona"
![]()
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Jan 2005
Messaggi: 199
|
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? Ultima modifica di gio84 : 02-03-2005 alle 15:33. |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
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.
Quote:
void fnc(const char *fname) { FILE *f = fopen(fname, "r+"); ... } int main(void) { const char *fname = "prova.txt"; fnc(fname); ... }
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: Jan 2005
Messaggi: 199
|
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... |
![]() |
![]() |
![]() |
#8 | ||
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
||
![]() |
![]() |
![]() |
#9 |
Member
Iscritto dal: Jan 2005
Messaggi: 199
|
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 .... Ultima modifica di gio84 : 02-03-2005 alle 16:00. |
![]() |
![]() |
![]() |
#10 | ||
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
![]() Quote:
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.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
||
![]() |
![]() |
![]() |
#11 |
Member
Iscritto dal: Jan 2005
Messaggi: 199
|
ok grazie
![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:37.