Atteindre EOF avec fgets

Je suis en train d'écrire une fonction qui effectuer quelques authentifications actions. J'ai un fichier avec tous les user_id:password:flag couples structuré comme ceci:

Users.txt

user_123:a1b2:0 user_124:a2b1:1 user_125:a2b2:2

C'est le code:

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 */

    }   
/*...*/    
}

Comment puis-je gérer les expressions du FOLKLORE d'atteindre? J'ai vu que lorsque EOF est atteint fgets ne modifie plus le usr_psw_line mais ni renvoie un pointeur NULL. Si EOF est atteint, cela signifie qu'aucun match sont trouvés dans le fichier et la boucle pauses.

Quelqu'un peut-il me donner quelques conseils ou suggestions?

  • Si la fin de fichier est atteinte sans la lecture de tout les personnages, fgets est obligé de retourner NULL. De toute façon, vous pouvez vérifier feof(fd) après fgets n'ai pas lu quoi que ce soit.
  • J'ai peur que les expressions du FOLKLORE n'est pas définie. Je ne écrire un fichier avec des enregistrements à l'intérieur.Je doit également définir explicitement les expressions du FOLKLORE? Comment faites-vous cela?
  • N'est-il pas atteint la fin du fichier pendant la lecture? Vous ne définissez pas EOF si la fin du fichier est atteinte, la prochaine tentative de lecture de il va mettre le drapeau en *fd, donc feof(fd) sera alors retourner vrai si tout fonctionne comme il se doit. Si tout ne fonctionne pas comme il devrait, hmmm.
  • EOF est un état, pas une partie du flux. Imaginez le flux de l'eau provenant d'un robinet. Quand vous ouvrez le robinet jusqu'à ce qu'il épuise obtenez-vous plus de l'eau (dans une autre couleur?) au signal, il n'y a plus d'eau?
  • Pour plausible, la taille de la table, vous feriez mieux de ne pas utiliser malloc() de l'information — juste de l'utilisation habituelle des tableaux.
  • pourriez-vous me dire pourquoi?
  • Sauf si vous allez être en utilisant plus de, oh, 8 Ko de données, vous pouvez ainsi éviter la surcharge de malloc() et de la possibilité de fuites en utilisant char usr_psw_line[USR_SIZE+PSW_SIZE+3+1]; au lieu de l'allocation dynamique de la mémoire. Dans main(), vous n'allez pas être de retour l'allocation d'un tableau, ce qui n'est pas une raison pour faire la répartition de ce temps — dans une fonction, il pourrait être une bonne raison.
  • Il est intéressant de noter que c'est la meilleure définition pour EOF j'ai jamais entendu.