Sto scrivendo una funzione che esegue alcune azioni di autenticazione. Ho un file con tutti i user_id:password:flag
coppie strutturata in questo modo:Raggiungere EOF con fgets
Users.txt
user_123:a1b2:0 user_124:a2b1:1 user_125:a2b2:2
Questo è il codice:
int main(){
/*...*/
/*user_id, password retrieving*/
USRPSW* p = malloc(sizeof(USRPSW));
if(p == NULL){
fprintf(stderr, "Dynamic alloc error\n");
exit(EXIT_FAILURE);
}
memset((void*)p, 0, sizeof(USRPSW));
if(usr_psw_read(acc_sock_ds, p->user_id, USR_SIZE) <= 0){
printf("Failed read: connection with %s aborted.\n",
inet_ntoa(client_addr.sin_addr));
close(acc_sock_ds);
continue;
}
if(usr_psw_read(acc_sock_ds, p->password, PSW_SIZE) <= 0){
printf("Failed read: connection with %s aborted.\n",
inet_ntoa(client_addr.sin_addr));
close(acc_sock_ds);
continue;
}
/*Authentication through user_id, password*/
FILE *fd;
fd = fopen(USERSFILE, "r");
if(fd == NULL){
fprintf(stderr, "Users file opening error\n");
exit(EXIT_FAILURE);
}
char *usr_psw_line = malloc(USR_SIZE+PSW_SIZE+3+1);
if(usr_psw_line == NULL){
fprintf(stderr, "Dynamic alloc error\n");
exit(EXIT_FAILURE);
}
while(1){
memset((void*)usr_psw_line, 0, sizeof(USR_SIZE+PSW_SIZE+3+1));
fgets(usr_psw_line, USR_SIZE+PSW_SIZE+3+1, fd);
printf("%s\n", usr_psw_line);
fseek(fd, 1, SEEK_CUR);
/*EOF management*/
/*usr_id - password matching checking */
}
/*...*/
}
Come posso gestire l'EOF raggiungere? Ho visto che quando EOF viene raggiunto, fgets
non modifica più la linea usr_psw_line ma non restituisce un puntatore NULL. Se EOF viene raggiunto significa che non viene trovata alcuna corrispondenza nel file degli utenti e che il loop si interrompe.
Qualcuno può darmi qualche consiglio o suggerimento?
Se la fine del file viene raggiunta senza leggere alcun carattere, 'fgets' è obbligato a restituire' NULL'. Ad ogni modo, è possibile controllare 'feof (fd)' dopo che 'fgets' non ha letto nulla. –
Ho paura che EOF non sia impostato. Scrivo solo un file con i record all'interno. Dovrei anche impostare esplicitamente l'EOF? Come fai a fare questo? –
Non si tratta di raggiungere la fine del file durante la lettura? Non si imposta EOF, se si raggiunge la fine del file, il prossimo tentativo di leggere da esso imposterà il flag in '* fd', quindi' feof (fd) 'restituirà true se tutto funziona come dovrebbe . Se tutto non funziona come dovrebbe, hmmm. –