PDA

Visualizza la versione completa : [C] Chiamate a fread() e fwrite()


UltraBeginner
16-11-2006, 10:36
Ciao a tutti,

secondo voi ce una ragione in particolare per cui la fwrite debba essere ignorata dopo una fread?

mi spiego, codice:


fseek(fptr,(record)*sizeof(person),SEEK_SET);
fread(&people,sizeof(person),1,fptr);
if(strcmp(people.lastname,"")==0)
printf("No info");
printf("Inserire nome cognome ed eta da sostituire");
scanf("%s %s %s",people.lastname,people.firstname,people.age);
fwrite(&people,sizeof(person),1,fptr);

in questo maniera ignora la fwrite...se pero prima della fwrite ci metto un altro

fseek(fptr,(record)*sizeof(person),SEEK_SET);

allora funziona tutto benissimo....

Ora va bene che la fseek porta il puntatore nel punto corretto al quale modificare il record nel file...ma perche dopo la fread la fwrite viene ignorata? Anche se la fread mi porta il puntatore al record sbagliato perche la fwrite non deve scrivere? :confused: :confused: :confused: :confused:

oregon
16-11-2006, 10:42
Cosi' come l'hai detto, non e' facile darti una risposta.

Intanto, non dici come fai ad essere sicuro che non ha scritto.
Dato che scrivi una struttura, devi controllare il contenuto binario del file dei dati ...

Inoltre, recupera il valore restituito dalla fwrite ed esamina anche se esiste un errore con GetLastError.

UltraBeginner
16-11-2006, 10:48
Originariamente inviato da oregon
Cosi' come l'hai detto, non e' facile darti una risposta.

Intanto, non dici come fai ad essere sicuro che non ha scritto.
Dato che scrivi una struttura, devi controllare il contenuto binario del file dei dati ...

Inoltre, recupera il valore restituito dalla fwrite ed esamina anche se esiste un errore con GetLastError.

eh guarda alla fine faccio un semplice ciclo di stampa

rewind(fptr);
for(i=1;i<=10;i++)
{
fread(&people,sizeof(person),1,fptr);
printf("%s %s %s\n",people.lastname,people.firstname,people.age);
}

e mi ritrovo solo i due record immessi(e un miniciclo da due iterazioni che precede il codice postato prima) e con gli altri record vuoti.
Adesso vedo che dice la GetLastError....Cmq non ero in errore quando dicevo che almeno in TEORIA non ci sarebbe motivo per cui la fwrite non debba scrivere dopo la fread no? :bh:

oregon
16-11-2006, 10:52
Non hai risposto alle mie domande ... come facciamo a continuare il discorso se non so come esamini il file in output ... ?

UltraBeginner
16-11-2006, 11:01
Originariamente inviato da oregon
Non hai risposto alle mie domande ... come facciamo a continuare il discorso se non so come esamini il file in output ... ?

ops, lo guardo semplicemente con notepad, il file lo salvo come .txt...

ah cmq ho usato getlasterror dopo la fwrite, ho messo l errore in una Dword e debuggando mi ha dato il numero 183...che andando a spulciare nel listone degli errori corrisponde a

ERROR_ALREADY_EXISTS
183 Cannot create a file when that file already exists.

Pero...dico io.... chi gli dice che deve creare il file? :confused: :confused:

e la cosa che mi lascia un po perplesso e il fatto che facendo precedere la fseek tutto funziona a meraviglia...cmq posto tutto il codice forse e meglio...



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>



int main()
{
typedef struct person{
char lastname[15];
char firstname[15];
char age[4];
};

char cogn[15];
int i,record,items;
FILE *fptr;
DWORD pippo;


person people={"","","0"}; //INIZIALIZZO STRUTTURA


fptr=fopen("c:\\nameage.txt","wb+");


for(i=1;i<=10;i++) //INIZIALIZZO FILE
{
items=fwrite(&people,sizeof(person),1,fptr);
}

printf("%d\n",items);
rewind(fptr);
for(i=1;i<=2;i++) //METTO DUE RECORD PER PROVA
{
printf("Inserire nome cognome ed eta");
scanf("%s %s %s",people.lastname,people.firstname,people.age);
items=fwrite(&people,sizeof(person),1,fptr);
}
printf("%d\n",items); // QUESTE STAMPA MI DICONO SE EFFETTIVAMENTE LA FWRITE FUNZIONA
rewind(fptr);
printf("Inserire il record da cercare "); //ORA PROVO UNA RICERCA
scanf("%d",&record);

fseek(fptr,(record)*sizeof(person),SEEK_SET);
fread(&people,sizeof(person),1,fptr);
if(strcmp(people.lastname,"")==0)
printf("No info");


printf("Inserire nome cognome ed eta da sostituire");
scanf("%s %s %s",people.lastname,people.firstname,people.age);
items=fwrite(&people,sizeof(person),1,fptr); // SENZA LA FSEEK DAVANTI VIENE IGNORATA
pippo=GetLastError(); // METTO IN PIPPO L EVENTUALE ERRORE
printf("%d\n",items);

rewind(fptr);
for(i=1;i<=10;i++) // STAMPO IL CONTENUTO DEL FILE
{
fread(&people,sizeof(person),1,fptr);
printf("%s %s %s\n",people.lastname,people.firstname,people.age);
}

rewind(fptr);

fflush(fptr);
fclose(fptr); // CHIUDO TUTTO

system("pause");

}

oregon
16-11-2006, 11:09
Non capisco come tu faccia ad eseguire questo programma dato che la open

fptr=fopen("c:\nameage.txt","wb+");

fallisce e fptr restituisce NULL ...

Il nome del file, in questo caso deve essere

fptr=fopen("c:\\nameage.txt","wb+");

e comunque tu devi controllare il valore di fptr in uscita ...

Inoltre, alcuni warning ...

1) la typedef, scritta cosi'

typedef struct person{
char lastname[15];
char firstname[15];
char age[4];
};

non serve perche' non definisci nessun tipo di dati. Devi scrivere qualcosa del genere

typedef struct _person{
char lastname[15];
char firstname[15];
char age[4];
} person;


2) la variabile items e' bene che sia di tipo size_t e non int

3) la variabile cogn[15] non e' mai usata

Loading