Question sur FEOF problème incompréhensible

acidjackproject Messages postés 9 Date d'inscription samedi 18 novembre 2000 Statut Membre Dernière intervention 5 avril 2008 - 5 avril 2008 à 16:51
klmlk Messages postés 2 Date d'inscription mercredi 20 juin 2007 Statut Membre Dernière intervention 28 juillet 2008 - 7 mai 2008 à 14:52
Bonjour, je programme en C et j'ai un souci:

j'ai:
void main()
{
    int i;
    long numprodb[100]={1,2,3,4,5};
    long numprod[100]={0};
    long numero;
    FILE *fnumero=NULL;

    fnumero=fopen("NumProduit.dat","wb");
    for(i=0;i<5;i++)
        fwrite(&numprodb[i],sizeof(numprodb[i]),1,fnumero);
    fclose(fnumero);   
    i=0;
    nproduit=0;
    fnumero=fopen("NumProduit.dat","rb");
    while(!(feof(fnumero)));
    {
         fread(&numero,sizeof(numprod[i]),1,fnumero);
        chargement(&nproduit,numprod,numero);
         i++;
    }
    fclose(fnumero);
}

void chargement...
{
    int i,j;
    if(*nproduit==0-
       *numprod=numero;
    else
    {
       for(i=0;i<*nproduit;i++);
       { 
          for(j=*nproduit;j>0 && numero<*(numprod+(j-1));j--)
             *(numprod+j)=*(numprod+j-1);
          *(numprod+j)=numero;
       }
    }
    (*nproduit)++;
}

Si j'affiche le I après tout il a fais 6 fois la boucle et non 5, ce qui pose problème quand je veux récupérer nproduit et moin vecteur NumProd correct puisqu'il contient 2 fois le dernier nombre (a savoir 1,2,3,4,5,5).

Est-ce que quelqu'un pourrait m'aider merci?

Julien

5 réponses

cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
5 avril 2008 à 18:07
Bonjour,

feof() retourne faux lorsqu'on lit APRES la fin de fichier ! Concrètement on fait une boucle de lecture en plus avec le contenu précédent conservé dans le buffer de lecture, d'où ce doublon.

Il vaut mieux sortir de la boucle de lecture lorsque fread() ne rend pas la quantité demandée :

while(true)
{
   if (fread(&numero,sizeof(numprod[i]),1,fnumero) != 1) break;
   ...
}

Jean-François
0
acidjackproject Messages postés 9 Date d'inscription samedi 18 novembre 2000 Statut Membre Dernière intervention 5 avril 2008
5 avril 2008 à 18:33
J'ai trouvé beaucoup plus simple en fait:

   fnumero=fopen("NumProduit.dat","rb");

    fread(&numero,sizeof(numprod[i]),1,fnumero);
    while(!(feof(fnumero)));
    {
         chargement(&nproduit,numprod,numero);
         fread(&numero,sizeof(numprod[i]),1,fnumero);
         i++;
    }
    fclose(fnumero);

en faisant comme cela ça marcjµhe parfaitement

Julien
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
5 avril 2008 à 18:49
Ca n'est pas plus simple (3 appels de fonctions au lieu d'un) !
Ca considère la première valeur comme différente des autres !
C'est la porte ouverte à bien des bugs !!!

Jean-François
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
5 avril 2008 à 19:29
#define ARRAY_SIZE 1024
long numero[ARRAY_SIZE], i;

while((i = fread(numero, sizeof(long), ARRAY_SIZE, fnumero)) {
    int j;
    for(j = 0; j < i; j++) chargement(&nproduit,numprod,numero[j]);
}

Voilà encore plus rapide. Pour ton fwrite, numprodb est déjà un tableau. On pourrait écrire tout d'un coup plutôt que faire cette boucle inutile:
fwrite(numprodb,sizeof(long),5,fnumero);

Et si tu veux beaucoup plus de rapidité, modifie ta fonction chargement pour qu'elle puisse traiter des buffers au lieu d'un seul long à la fois.

C++ (@++)<!--
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
klmlk Messages postés 2 Date d'inscription mercredi 20 juin 2007 Statut Membre Dernière intervention 28 juillet 2008
7 mai 2008 à 14:52
Big uP JF ta solution c'est la meilleur et la plus rapide

KLMLK
0
Rejoignez-nous