Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563

    C - fprintf per modificare un record

    Salve.
    Per il primo esame di fondamenti di infomatica ci hanno chiesto di implementare una struttura dati.
    Così io ho deciso di optare per una tabella (da lui stesso suggerita) e fin'ora ho implementato inserimento, ricerca (sia per parti che per nome completo) in tutti i campi e bla bla bla.

    Purtroppo, non potendo usare nè i file ad accesso casuale, ne le API di Windows, mi sono trovato in difficoltà nel modificare un record scritto su un file di testo.

    E' un file ad accesso sequenziale, del tipo

    intero stringa stringa stringa stringa intero
    Ora dovrei, su richiesta dell'utente, modificare l'ultimo intero. E ho pensato a una cosa del genere

    codice:
    void EliminaNome(FILE *f)
    {
    	int Index;
    
    	Rubrica rub;
    
    	printf("Inserire l'indice da eliminare: ");
    	scanf("%d",&Index);
    
    	if (Index < 0)
    		printf("\nIndice non valido");
    	else
    	if (Index > ProssimoIndice(f) - 1)
    		printf("\nIl record selezionato non esiste");
    	else
    	{
    		fseek(f,0,SEEK_SET);
    
    		for (unsigned int i = 0; i < Index-1; i++)
    		{
    			if (feof(f))
    				break;
    
    			fscanf(f,"%d %s %s %s %s %d",&rub.Index,rub.Nome.Nome,rub.Nome.Cognome,rub.Nome.Indirizzo,rub.Nome.Telefono,&rub.Eliminato);
    		}
    
    			fscanf(f,"%d %s %s %s %s",&rub.Index,rub.Nome.Nome,rub.Nome.Cognome,rub.Nome.Indirizzo,rub.Nome.Telefono);
    			fprintf(f,"%d",1);
    
    	}
    
    }
    Nella speranza che le fscanf mi permettessero di andare avanti nei records, ma a quanto pare non funziona (il file è aperto in modalità r+)
    Avreste qualche consiglio?
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  2. #2
    Che problemi ti da il tuo codice ?
    Come sono terminate le linee (newline o simili) ?

    Aspetta ... mi sono appena accorto, che usi un record rub, e che lo sovrascrivi Index - 1 volte.
    Quindi alla fine ti trovi memorizzato solo l'ultimo record ...

  3. #3
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Scusate ma sono stato in vacanza in Belgio quindi non ho potuto rispondere.
    I record sono terminati ognuno con il carattere di nuova linea \n.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  4. #4
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Nessuno ha idee di come fare??
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  5. #5
    Utente di HTML.it L'avatar di sotoli
    Registrato dal
    Mar 2008
    Messaggi
    150
    Potresti creare un altro file, ci scrivi il contenuto del file originale con le modifiche apportate, cancelli il file originale e rinomini quello nuovo con il nome dell'originale.
    Crestron Control Systems and AMX Control Systems Programmer

  6. #6
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Originariamente inviato da sotoli
    Potresti creare un altro file, ci scrivi il contenuto del file originale con le modifiche apportate, cancelli il file originale e rinomini quello nuovo con il nome dell'originale.
    Ok questa è già un'idea. La userò in extremis.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  7. #7
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Veramente nessuno ha idee? Ho spiegato male il problema??
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  8. #8
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Mi viene in mente che durante la prima chiamata a EliminaFile, se il file entra in EOF, poi ci rimane. Forse ti basta cambiare la fseek(f,0,SEEK_SET); con rewind(f) che fa la stessa cosa, ma toglie la condizione di errore. ( Tra l'altro anche la fscanf può restituire EOF se qualcosa va storto).

    http://www.cplusplus.com/reference/c...io/rewind.html

  9. #9
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Non sembra che abbia funzionato anche con rewind, in quando non ci sono errori nella lettura.
    Se io ho una riga di questo tipo

    Indice Nome Cognome Numero Indirizzo Eliminato
    Se voglio eliminare l'indice numero n, ho fatto

    [list=a][*]Resetto il file[*]Scorro i record N-1 volte[*]Scorro il record un'ulteriore volta ma mancando l'ultimo campo[*]fprintf per modificare.[/list=a]

    A quanto pare va bene tutto, ma sembra che venga ignorato il fprintf della modifica.
    La soluzione può funzionare? Se si, perchè a me non va?
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  10. #10
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381

    Re: C - fprintf per modificare un record

    Originariamente inviato da XWolverineX
    ...ma a quanto pare non funziona (il file è aperto in modalità r+)...
    Vale a dire in sola lettura. Come puoi pretendere di fare una fprintf su un file di sola lettura?
    Comunque anche se non fosse, la fprintf dovrebbe accodare il dato modificato, non sostituirlo.
    Dovresti leggere l'intero record, modificare il dato che ti serve e riscrivere tutto il record al posto di quello da modificare.

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.