PDA

Visualizza la versione completa : C - fprintf per modificare un record


XWolverineX
25-12-2008, 20:40
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



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?

menphisx
26-12-2008, 06:43
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 ...

XWolverineX
02-01-2009, 18:54
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.

XWolverineX
03-01-2009, 10:01
Nessuno ha idee di come fare??

sotoli
03-01-2009, 12:07
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.

XWolverineX
03-01-2009, 17:07
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.

XWolverineX
04-01-2009, 15:07
Veramente nessuno ha idee? Ho spiegato male il problema??

shodan
04-01-2009, 15:24
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/clibrary/cstdio/rewind.html

XWolverineX
04-01-2009, 15:52
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? :D

shodan
04-01-2009, 16:17
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.

Loading