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
| #include <stdio.h>
#include <stdlib.h>
static int
ecrire_int(int d, FILE *fp)
{
int err = 0;
if (fp != NULL)
{
unsigned char tampon[2] = {0};
int rv;
/* -tc- gestion speciale des entiers negatifs pour tenir compte des
architectures ou les nombres negatifs ne sont pas representes par
complement a deux comme sur ma machine */
unsigned int donnee = (d >= 0) ? d : -d + 0x7fffU;
/* -tc- on decide qu'un entier de type int est represente sur au plus 2
octets, grand boutiste */
tampon[1] = (donnee >> 0) & 0xff;
tampon[0] = (donnee >> 8) & 0xff;
rv = fwrite(tampon, 1, sizeof tampon, fp);
/* -tc- on verifie que toutes les donnees ont ete ecrites dans le fichier */
if (rv != sizeof tampon)
{
/* -tc- Erreur: ecriture des donnees incomplete */
err = 1;
}
}
else
{
/* -tc- Erreur: argument invalide! */
err = 2;
}
return err;
}
static int
lire_int(int *p, FILE *fp)
{
int err = 0;
/* -tc- on verifie la validite des arguments */
if (p != NULL && fp != NULL)
{
unsigned char tampon[2] = {0};
unsigned int donnee = 0;
int rv = 0;
rv = fread(tampon, 1, sizeof tampon, fp);
/* -tc- on verifie que la lecture est complete */
if (rv == sizeof tampon)
{
donnee = donnee | (tampon[0] << 8);
donnee = donnee | (tampon[1] << 0);
*p = (donnee > 0x7fffU) ? -(donnee - 0x7fffU) : donnee;
}
else
{
/* -tc- Erreur de lecture ou EOF */
if (feof(fp) != 0)
{
err = EOF;
}
else
{
err = 1;
}
}
}
else
{
/* -tc- Erreur: argument invalide */
err = 2;
}
return err;
}
int main(void)
{
int entier = 32767;
FILE *fichier = NULL;
int ret = EXIT_SUCCESS;
/* -tc- on ouvre le fichier en ecriture en mode binaire*/
fichier = fopen("mon-fichier.dat", "wb");
if (fichier != NULL)
{
int err = 0;
err = ecrire_int(entier, fichier);
if (err != 0)
{
fprintf(stderr, "Erreur d'ecriture!\n");
ret = EXIT_FAILURE;
}
fclose(fichier), fichier = NULL;
}
else
{
fprintf(stderr, "impossible d'ouvrir le fichier en ecriture!\n");
ret = EXIT_FAILURE;
}
/* -tc- on ouvre le fichier en lecture en mode binaire */
fichier = fopen("mon-fichier.dat", "rb");
if (fichier != NULL)
{
int err = 0;
err = lire_int(&entier, fichier);
if (err != 0)
{
fprintf(stderr, "Erreur de lecture ou fin de fichier!\n");
ret = EXIT_FAILURE;
}
printf("entier vaut %d\n", entier);
fclose(fichier), fichier = NULL;
}
else
{
fprintf(stderr, "impossible d'ouvrir le fichier en lecture!\n");
ret = EXIT_FAILURE;
}
return ret;
} |
Partager