1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
| int lire_operation_fmt(FILE *fp_compte, size_t n_op, Operation *p_op)
{
size_t i;
int err = OK;
char s_ligne[LONG_LIGNE] = {0};
/* on se rend a la bonne ligne */
fseek(fp_compte, 0, SEEK_SET);
for(i = 0; i < n_op; i++)
{
if(fgets(s_ligne, sizeof s_ligne, fp_compte) == NULL)
{
err = OP_INEXISTANTE;
break;
}
}
if(err != OP_INEXISTANTE)
{
if(verif_fmt_ligne(s_ligne, sizeof s_ligne) == OK)
{
/* copie des valeurs */
size_t j;
for(i = j = 0; s_ligne[i] != ','; i++, j++)
{
p_op->s_date[j] = s_ligne[i];
}
p_op->s_date[j] = 0;
i++;
for(j = 0; s_ligne[i] != ','; i++, j++)
{
p_op->s_montant[j] = s_ligne[i];
}
p_op->s_montant[j] = 0;
i++;
for(j = 0; s_ligne[i] != ','; i++, j++)
{
p_op->s_motif[j] = s_ligne[i];
}
p_op->s_motif[j] = 0;
i++;
for(j = 0; s_ligne[i] != '\n'; i++, j++)
{
p_op->s_solde[j] = s_ligne[i];
}
p_op->s_solde[j] = 0;
/* conversion en double pour montant et solde */
char *p_conversion = NULL;
errno = 0;
/* l'erreur se produit ici */
p_op->montant = strtod(p_op->s_montant, &p_conversion);
if(p_conversion != NULL)
{
if(*p_conversion == 0)
{
/* valeur trop grande */
if(errno == ERANGE)
{
err = ERR_VAL;
}
else
{
p_conversion = NULL;
errno = 0;
p_op->solde = strtod(p_op->s_solde, &p_conversion);
if(p_conversion != NULL)
{
if(*p_conversion == 0)
{
/* valeur trop grande */
if(errno == ERANGE)
{
err = ERR_VAL;
}
}
else
{
err = ERR_CONV;
}
}
}
}
else
{
err = ERR_CONV;
}
}
}
else
{
err = FORMAT_KO;
}
}
return err;
}
int verif_fmt_ligne(const char* s_ligne, size_t t)
{
/* format correct <=> (NB_VIRGULES) virgules dans la ligne */
int nb_virgules = 0;
size_t i;
for(i = 0; i < t; i++)
{
if(s_ligne[i] == '\0')
{
break;
}
else if(s_ligne[i] == ',')
{
nb_virgules++;
}
}
return nb_virgules - NB_VIRGULES;
} |
Partager