1572Fermer1574
FarewellLe 26/05/2010 à 19:10
Oui, c'est bien vrai cheeky

Bon, voilà ce que j'ai écrit :
    for (i = 0; i < numberEntries; i++)
    {
        fread (&(cData[i].playerName), 1, 20, scoresFile);
        readUint16_t (scoresFile, &(cData[i].score));
        readUint16_t (scoresFile, &(cData[i].BV));
        readUint16_t (scoresFile, &(cData[i].V));
        readUint16_t (scoresFile, &(cData[i].TV));
        readUint16_t (scoresFile, &(cData[i].lostATGuns));
        readUint16_t (scoresFile, &(cData[i].lostAAGuns));
        readUint16_t (scoresFile, &(cData[i].lostARTGuns));
        readUint16_t (scoresFile, &(cData[i].lostTanks));
        readUint16_t (scoresFile, &(cData[i].lostRecons));
        readUint16_t (scoresFile, &(cData[i].lostInfanteries));
        readUint16_t (scoresFile, &(cData[i].lostFighters));
        readUint16_t (scoresFile, &(cData[i].lostBombers));
        readUint16_t (scoresFile, &(cData[i].killedATGuns));
        readUint16_t (scoresFile, &(cData[i].killedAAGuns));
        readUint16_t (scoresFile, &(cData[i].killedARTGuns));
        readUint16_t (scoresFile, &(cData[i].killedTanks));
        readUint16_t (scoresFile, &(cData[i].killedRecons));
        readUint16_t (scoresFile, &(cData[i].killedInfanteries));
        readUint16_t (scoresFile, &(cData[i].killedFighters));
        readUint16_t (scoresFile, &(cData[i].killedBombers));
    }

    if (ferror (scoresFile) == 0)
        goto Success;

Avec :
int readUint16_t (FILE* stream, uint16_t* target)
{
    int a, b;
    if ((fread (&a, 1, 1, stream) != 1) || (fread (&b, 1, 1, stream) != 1))
        return 0;
    *target = (a << 8) + b;
    return 1;
}

Je n'ai vu nulle part que lire sur un flux qui a son flag d'erreur activé pouvait poser un problème, j'imagine juste que les fonctions fread/fwrite deviennent inopérantes jusqu'à ce qu'on appelle clearerr(). Donc je pense pouvoir me contenter de tester ferror qu'une fois la fin des lectures atteinte plutôt qu'à chaque accès.