PDA

View Full Version : [C] Funzione feof


Manugal
09-04-2006, 11:49
Ciao!

Volevo sapere se la funzione feof() funziona anche sui file binari. Inoltre volevo capire bene come funziona. Cioè se raggiunge la fine del file mi dà un valore diverso da 0 no? Però poi se io voglio ritornare all'inizio del file devo richiamare la clearerr e poi la rewind oppure solo la rewind?

Fenomeno85
09-04-2006, 12:28
allora

feof () restituisce 1 in caso che sei alla fine .. questo per qualsiasi tipo di file.

se vuoi ritornare all'inizio puoi usare due tecniche .. il rewind oppure usare fseek

~§~ Sempre E Solo Lei ~§~

Manugal
09-04-2006, 12:33
Ok, ho capito grazie. Allora non mi torna qualcosa su questa mi funzione:


#include "LPC_M2_Include.h"
#include "LPC_Include.h"

int GetFieldInfo (int handle, int NumFields, FIELD_DATA_t *FieldData){
long spostamento;
short tmp;
int cntFields=0;
int verificaSeek=0;
int test;
int verificaRead=0;
if((FieldData==NULL) || IsDBFHandle(handle)!=0 || NumFields<0){
char Err[256];
(void) sprintf(Err, "Handle non valido, NumFields<0 o puntatore FielData NULL");
LPC_GestioneErrore(LPC_BAD_ARG, "GetFieldInfo", Err);
return LPC_BAD_ARG;
}
/*if(!nomeValido(FieldData->Name)){
char Err[256];
(void) sprintf(Err, "Campo non valido");
LPC_GestioneErrore(LPC_BAD_FIELD, "GetFieldInfo", Err);
return LPC_BAD_FIELD;
}*/
rewind(ihndl[handle].fp);
spostamento=(sizeof(char)*DBF_NAME_LENGTH+1)+(sizeof(short)*1)+(sizeof(long)*1)+(sizeof(short)*1)+(sizeof(short)*1)+(sizeof(long)*1);
fseek(ihndl[handle].fp,spostamento,SEEK_SET);
if(NumFields==0){
while(feof(ihndl[handle].fp)!=1){
verificaRead+=fread(FieldData->Name,sizeof(char),FIELD_NAME_LENGTH+1,ihndl[handle].fp);
/*if(!nomeValido(FieldData->Name)){
char Err[256];
(void) sprintf(Err, "Campo non valido");
LPC_GestioneErrore(LPC_BAD_FIELD, "GetFieldInfo", Err);
return LPC_BAD_FIELD;
}*/
/*printf("\n\n%s\n\n", FieldData->Name);*/
verificaSeek+=fseek(ihndl[handle].fp,sizeof(char)*FIELD_NAME_LENGTH+1,SEEK_CUR);
verificaRead+=fread(&tmp,sizeof(short),1,ihndl[handle].fp);
FieldData->FieldType=(uint16_t) ntohs(tmp);
/*printf("%d\n\n", FieldData->FieldType);*/
verificaSeek+=fseek(ihndl[handle].fp,sizeof(short),SEEK_CUR);
verificaRead+=fread(&tmp,sizeof(short),1,ihndl[handle].fp);
FieldData->FieldLen=(uint16_t) ntohs(tmp);
/*printf("%d\n\n", FieldData->FieldLen);*/
verificaSeek+=fseek(ihndl[handle].fp,sizeof(short)+1,SEEK_CUR);
++cntFields;
}
if(verificaSeek!=0){
char Err[256];
(void) sprintf(Err, "Errore di posizione sul file");
LPC_GestioneErrore(LPC_ERR_SEEK, "GetFieldInfo", Err);
return LPC_ERR_SEEK;
}
if(verificaRead!=(sizeof(char)*FIELD_NAME_LENGTH+1+1+1)*cntFields){
char Err[256];
(void) sprintf(Err, "Errore di lettura del file");
LPC_GestioneErrore(LPC_ERR_READ, "GetFieldInfo", Err);
return LPC_ERR_READ;
}
NumFields=cntFields;
}
else if(NumFields>0){
while((cntFields++)<NumFields){
verificaRead+=fread(FieldData->Name,sizeof(char),FIELD_NAME_LENGTH+1,ihndl[handle].fp);
if(!nomeValido(FieldData->Name)){
char Err[256];
(void) sprintf(Err, "Campo non valido");
LPC_GestioneErrore(LPC_BAD_FIELD, "GetFieldInfo", Err);
return LPC_BAD_FIELD;
}
printf("\n\n%s\n\n", FieldData->Name);
verificaSeek+=fseek(ihndl[handle].fp,sizeof(char)*FIELD_NAME_LENGTH+1,SEEK_CUR);
verificaRead+=fread(&tmp,sizeof(short),1,ihndl[handle].fp);
FieldData->FieldType=(uint16_t) ntohs(tmp);
printf("%d\n\n", FieldData->FieldType);
verificaSeek+=fseek(ihndl[handle].fp,sizeof(short),SEEK_CUR);
verificaRead+=fread(&tmp,sizeof(short),1,ihndl[handle].fp);
FieldData->FieldLen=(uint16_t) ntohs(tmp);
printf("%d\n\n", FieldData->FieldLen);
verificaSeek+=fseek(ihndl[handle].fp,sizeof(short)+1,SEEK_CUR);
}
if(verificaSeek!=0){
char Err[256];
(void) sprintf(Err, "Errore di posizione sul file");
LPC_GestioneErrore(LPC_ERR_SEEK, "GetFieldInfo", Err);
return LPC_ERR_SEEK;
}
if(verificaRead!=(sizeof(char)*FIELD_NAME_LENGTH+1+1+1)*NumFields){
char Err[256];
(void) sprintf(Err, "Errore di lettura del file");
LPC_GestioneErrore(LPC_ERR_READ, "GetFieldInfo", Err);
return LPC_ERR_READ;
}
}
return LPC_OK;
}


Qui mi viene fatto un test prima con NumFields>0 e poi con NumFields==0. Quando fa il test con NumFields==0, feof() è sempre uguale a 0 e mi cicla all'infinito :(

Non capisco perché.

P.S.: Ignora i commenti, erano solo delle prove che stavo facendo ;)

Fenomeno85
09-04-2006, 12:50
adesso esco a votare

ho trovato questo

http://www.cplusplus.com/ref/cstdio/feof.html

~§~ Sempre E Solo Lei ~§~

Tyler Darden
09-04-2006, 13:47
mmm ... manugal con chi segui?

Qu@ker
09-04-2006, 16:23
Ma sei sicuro che restituisca 1?

oku@big:~$ man feof | sed -ne '20,22p'
The function feof tests the end-of-file indicator for the stream
pointed to by stream, returning non-zero if it is set. The end-of-file
indicator can only be cleared by the function clearerr.
oku@big:~$

Manugal
09-04-2006, 16:42
Avevo provato (per tagliare la testa al toro) anche a mettere la condizione !=0 ma è la stessa cosa cicla sempre. Infatti poi ho provato anche a mettere delle printf e mi sono accorto che praticamente la feof vale sempre 0 non capisco perché. :(

x Tyler Darden:


mmm.... manugal con chi segui?


???

Tyler Darden
09-04-2006, 18:00
programmazione 2

Manugal
09-04-2006, 18:26
2° canale :)

Nessuno ha qualche idea?