| 
 | |||||||
| 
 | 
|  | 
|  | 
|  | Strumenti | 
|  02-03-2005, 12:55 | #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 | 
|   |   | 
|  02-03-2005, 15:07 | #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 | ||
|   |   | 
|  02-03-2005, 15:34 | #3 | 
| Member Iscritto dal: Jan 2005 
					Messaggi: 199
				 | 
		eh ma la cancellazione non funziona....
		 | 
|   |   | 
|  02-03-2005, 15:48 | #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"   ). Se puoi fare un programmino di test in grado di riprodurre il problema sarebbe l'ideale. 
				__________________ 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 | 
|   |   | 
|  02-03-2005, 16:21 | #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 16:33. | 
|   |   | 
|  02-03-2005, 16:32 | #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 | |
|   |   | 
|  02-03-2005, 16:39 | #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... | 
|   |   | 
|  02-03-2005, 16:45 | #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 | ||
|   |   | 
|  02-03-2005, 16:51 | #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 17:00. | 
|   |   | 
|  02-03-2005, 17:40 | #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 | ||
|   |   | 
|  02-03-2005, 18:56 | #11 | 
| Member Iscritto dal: Jan 2005 
					Messaggi: 199
				 | 
		ok grazie   | 
|   |   | 
|   | 
| Strumenti | |
| 
 | 
 | 
Tutti gli orari sono GMT +1. Ora sono le: 21:09.









 
		 
		 
		 
		






 
  
 



 
                        
                        










