Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [C++] Sovrascrivere record di un file

    Ciao a tutti, ho un file binario con record a lunghezza fissa. Quello che dovrei fare è:
    per ogni record N se il record N+1 contiene un certo valore allora modifico il contenuto di N.
    Per il momento l'ho pensata come segue, ma prima di mettere giù il codice vorrei sapere se la logica è giusta visto che è la prima volta che provo a sovrascrivere un record e non so se ragiono nel modo corretto.

    - Mi posiziono alla fine del file (SEEK_END - sizeof(StrutturaRecord))
    - Leggo il record (fread)

    fino a quando non raggiungo l'inizio del file
    - Verifico condizione
    - Mi posiziono al record precedente (SEEK_CUR - 2*sizeof(StrutturaRecord))
    - Leggo il record (fread)
    - Se la condizione è vera modifico i dati appena letti, mi riposiziono all'inizio del record (SEEK_CUR - sizeof(StrutturaRecord)) e lo sovrascrivo (fwrite)

    La logica è giusta o esistono modi più opportuni?
    E' corretto aprire il file in modalità "rwb"

    Grazie
    Luciano

  2. #2
    ho provato a mettere giù il codice, ma anzichè spostarmi indietro di un record alla volta (-sizeof(SRP)) mi sposto indietro di un record ed un byte alla volta... non ne capisco il motivo...
    codice:
    	fpi=fopen(NomeFilePagineTmp,"rwb");
    	
    	fseek(fpi,-(long)(sizeof(SRP)),SEEK_END);
    	do
    	{
    		fread(&SRP,sizeof(SRP),1,fpi);
    		bCondizione=(memcmp(SRP.PrimaPaginaValore,"X",1)==0);
    		if(bCondizione)
    		{
    			if(fseek(fpi,-(long)(2*(sizeof(SRP))),SEEK_CUR)==0)
    			{
    				fread(&SRP,sizeof(SRP),1,fpi);
    				fseek(fpi,-(long)(sizeof(SRP)),SEEK_CUR);
    				memcpy(SRP.UltimaPaginaValore,"X",1);
    				fwrite(&SRP,sizeof(SRP),1,fpi);
    			}
    		}
    	}while(fseek(fpi,-(long)(2*(sizeof(SRP))),SEEK_CUR)==0);

  3. #3
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Ma il file quanto è grosso? Perché se è su dimensioni decenti, ti converrebbe portare tutto il file in un vector ed elaborarlo in memoria e infine riscrivere il file modificato.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  4. #4
    purtroppo sono file consistenti, anche con milioni di record!
    Andrei ad utilizzare troppa memoria!

  5. #5
    dopo alcune correzzioni mi sposto nel file in maniera corretta.
    Salto l'ultimo record che so per certo che non mi interessa, quindi parto dal penultimo record
    codice:
    fseek(fpi,-(long)(2*sizeof(SRP)),SEEK_END);
    	do
    	{
    		fread(&SRP,sizeof(SRP),1,fpi);
    		bCondizione=(memcmp(SRP.PrimaPaginaValore,"X",1)==0);
    		if(bCondizione)
    		{
    			if(fseek(fpi,-(long)(1+2*(sizeof(SRP))),SEEK_CUR)==0)
    			{
    				fread(&SRP,sizeof(SRP),1,fpi);
    				fseek(fpi,-(long)(1+sizeof(SRP)),SEEK_CUR);
    				memcpy(SRP.UltimaPaginaValore,"X",1);
    				fwrite(&SRP,sizeof(SRP),1,fpi);
    				fseek(fpi,1,SEEK_CUR);
    			}
    		}
    	}while(fseek(fpi,-(long)(1+2*(sizeof(SRP))),SEEK_CUR)==0);
    però sembra che fwrite non abbia nessun effetto, eppure in debug ci passo.
    In poche parole il file non viene modificato, nemmeno la data di modifica del file viene cambiata!!!
    Ma è corretto che per sovrascrivere un record apro il file in modalità "rwb" e scrivo con fwrite?

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Potrebbe essere dovuto al buffer di fwrite che non viene svuotato. Prova a mettere un fflush(fpi) subito dopo la fwrite.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  7. #7
    Risolto!!!
    La modalità corretta per fare quello di cui ho bisogno è "r+".
    Ora funziona!

    Grazie comunque!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.