IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Problème fread MinGW-win32


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2009
    Messages : 61
    Par défaut Problème fread MinGW-win32
    Bonjour à tous et à toutes,
    je rencontre un problème avec la fonction fread et sollicite votre aide pour trouver une solution.
    Mon problème concerne la version Windows de mon programme, sous Linux tout fonctionne parfaitement,
    et est donc potentiellement lié à l'utilisation de MinGW que j'utilise pour compiler mon programme sous Windows.

    Le contexte de l'erreur est le suivant avec mon programme je peut écrire et lire des fichiers binaires qui contiennent tout un tas d'information,
    l'écriture du fichier ne pose aucun problème que cela soit fait sous Windows ou Linux.
    La lecture d'un fichier, que ce dernier ai été écrit sous Windows ou Linux, ne pose aucun problème sous Linux,
    en revanche pas moyen de relire correctement un fichier sous Windows.
    Voici un exemple du code de lecture que j'ai écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
     
    #DEFINE SPROP 15
     
    int readfile ()
    {
      FILE * fp;
      int i, j, k;
      int nspec;
      double * spec_prop[SPROP];
     
      char * projfile = 'myproj.bin';
     
      fp = open (projfile, 'r'); 
      if (fread (& i, sizeof(i), 1, fp) != 1) return 1;
     
    // Une série d'information est lue, toujours avec le 'return 1;' en cas d'erreur ... 
    // dans les lignes suivantes la variable 'nspec' est lue dans le fichier en question.
    // Après quoi j'ai ajouté des print autour de la zone contenant l'erreur qui me pose tant de soucis
     
    #ifdef DEBUG
      g_print ("DEBUG::OPEN_PROJECT:: So far so good ...\n");
      g_print ("DEBUG::OPEN_PROJECT:: npsec= %d\n", nspec);
    #endif
      if (nspec != 0)
      {
        for (i=0; i<SPROP; i++)
        {
          spec_prop[i] = calloc(nspec, sizeof*spec_prop[i]);
    #ifdef DEBUG
          g_print ("DEBUG::OPEN_PROJECT:: i= %d\n", i);
    #endif
          k = fread (spec_prop[i], sizeof(double), nspec, fp);
    // C'est ici que l'erreur se produite, la fonction fread est à ce stade censée lire 'nspec' réels double précision
    // dans mon exemple (voir plus bas) elle devrait renvoyer 3 mais renvoie 2.  
    #ifdef DEBUG
          if (k != nspec)
          {
            g_print ("DEBUG::OPEN_PROJECT:: bug k= %d\n", k);
            for (j=0; j<nspec; j++)
            {
              g_print ("DEBUG::OPEN_PROJECT:: j= %d, spec_prop[i][j]= %f\n", j, spec_prop[i][j]);
            }
            return 1;
          }
          else
          {
            for (j=0; j<nspec; j++)
            {
              g_print ("DEBUG::OPEN_PROJECT:: j= %d, spec_prop[i][j]= %f\n", j, spec_prop[i][j]);
            }
          }
    #endif
        }
      }
      return 0;
    }
    Voici maintenant le type de sortie que j'obtiens avec ce bout de code, le 1er cas est le bon cas (Linux), le second est celui dans laquelle je rencontre le problème que je souhaite résoudre (Windows):


    Cas 1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    DEBUG::OPEN_PROJECT:: So far so good ...
    DEBUG::OPEN_PROJECT:: npsec= 3
    DEBUG::OPEN_PROJECT:: i= 0
    DEBUG::OPEN_PROJECT:: j= 0, spec_prop[i][j]= 38.000000
    DEBUG::OPEN_PROJECT:: j= 1, spec_prop[i][j]= 22.000000
    DEBUG::OPEN_PROJECT:: j= 2, spec_prop[i][j]= 8.000000
    DEBUG::OPEN_PROJECT:: i= 1
    DEBUG::OPEN_PROJECT:: j= 0, spec_prop[i][j]= 1.000000
    DEBUG::OPEN_PROJECT:: j= 1, spec_prop[i][j]= 1.000000
    DEBUG::OPEN_PROJECT:: j= 2, spec_prop[i][j]= 3.000000
    DEBUG::OPEN_PROJECT:: i= 2
    DEBUG::OPEN_PROJECT:: j= 0, spec_prop[i][j]= -0.130000
    DEBUG::OPEN_PROJECT:: j= 1, spec_prop[i][j]= -0.023000
    DEBUG::OPEN_PROJECT:: j= 2, spec_prop[i][j]= 0.000500
    DEBUG::OPEN_PROJECT:: i= 3
    DEBUG::OPEN_PROJECT:: j= 0, spec_prop[i][j]= 0.108000
    DEBUG::OPEN_PROJECT:: j= 1, spec_prop[i][j]= 0.012000
    DEBUG::OPEN_PROJECT:: j= 2, spec_prop[i][j]= 0.000100
    DEBUG::OPEN_PROJECT:: i= 4
    DEBUG::OPEN_PROJECT:: j= 0, spec_prop[i][j]= 17.730219
    DEBUG::OPEN_PROJECT:: j= 1, spec_prop[i][j]= 9.818524
    DEBUG::OPEN_PROJECT:: j= 2, spec_prop[i][j]= 2.960427
    DEBUG::OPEN_PROJECT:: i= 5
    DEBUG::OPEN_PROJECT:: j= 0, spec_prop[i][j]= 9.795867
    DEBUG::OPEN_PROJECT:: j= 1, spec_prop[i][j]= 1.522646
    DEBUG::OPEN_PROJECT:: j= 2, spec_prop[i][j]= 2.508818

    Cas 2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    DEBUG::OPEN_PROJECT:: So far so good ...
    DEBUG::OPEN_PROJECT:: npsec= 3
    DEBUG::OPEN_PROJECT:: i= 0
    DEBUG::OPEN_PROJECT:: j= 0, spec_prop[i][j]= 38.000000
    DEBUG::OPEN_PROJECT:: j= 1, spec_prop[i][j]= 22.000000
    DEBUG::OPEN_PROJECT:: j= 2, spec_prop[i][j]= 8.000000
    DEBUG::OPEN_PROJECT:: i= 1
    DEBUG::OPEN_PROJECT:: j= 0, spec_prop[i][j]= 1.000000
    DEBUG::OPEN_PROJECT:: j= 1, spec_prop[i][j]= 1.000000
    DEBUG::OPEN_PROJECT:: j= 2, spec_prop[i][j]= 3.000000
    DEBUG::OPEN_PROJECT:: i= 2
    DEBUG::OPEN_PROJECT:: j= 0, spec_prop[i][j]= -0.130000
    DEBUG::OPEN_PROJECT:: j= 1, spec_prop[i][j]= -0.023000
    DEBUG::OPEN_PROJECT:: j= 2, spec_prop[i][j]= 0.000500
    DEBUG::OPEN_PROJECT:: i= 3
    DEBUG::OPEN_PROJECT:: bug k= 2
    DEBUG::OPEN_PROJECT:: j= 0, spec_prop[i][j]= 0.108000
    DEBUG::OPEN_PROJECT:: j= 1, spec_prop[i][j]= 0.012000
    DEBUG::OPEN_PROJECT:: j= 2, spec_prop[i][j]= 0.000000
    La lecture du fichier ne s'arrête pas à ce jeu d'instruction, j'ai testé une continuation de lecture en supprimant le 'return 1;' au niveau de l'erreur,
    mais après cela le contenu du fichier semble désespérément vide, et toutes variable lu prend la valeur 0.
    Je précise encore une fois que ce problème n'affecte que Windows.

    Je ne suis pas capable d'identifier la source de mes ennuis, toutes vos lumières seront très appréciées !

    Merci d'avance donc

    S.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Slookeur Voir le message
    Bonjour à tous et à toutes,
    je rencontre un problème avec la fonction fread et sollicite votre aide pour trouver une solution.
    Mon problème concerne la version Windows de mon programme, sous Linux tout fonctionne parfaitement,
    et est donc potentiellement lié à l'utilisation de MinGW que j'utilise pour compiler mon programme sous Windows.

    Le contexte de l'erreur est le suivant avec mon programme je peut écrire et lire des fichiers binaires qui contiennent tout un tas d'information,
    l'écriture du fichier ne pose aucun problème que cela soit fait sous Windows ou Linux.
    La lecture d'un fichier, que ce dernier ai été écrit sous Windows ou Linux, ne pose aucun problème sous Linux,
    en revanche pas moyen de relire correctement un fichier sous Windows.
    Voici un exemple du code de lecture que j'ai écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    #DEFINE SPROP 15
    
    int readfile ()
    {
      FILE * fp;
      int i, j, k;
      int nspec;
      double * spec_prop[SPROP];
    
      char * projfile = 'myproj.bin';
    
      fp = open (projfile, 'r'); 
      ...
    Je précise encore une fois que ce problème n'affecte que Windows.

    Je ne suis pas capable d'identifier la source de mes ennuis, toutes vos lumières seront très appréciées !

    Merci d'avance donc

    S.
    Salut

    Quand on ouvre un fichier binaire sous Windows avec fopen, il faut rajouter le flag "b" => fp=fopen(fichier, "rb") (ou "wb")
    Si on l'ouvre avec open, alors faut rajouter le flag O_BINARY => fp=open(fich, O_RDONLY|O_BINARY)
    On n'a pas à faire cette distinction sous Linux car cet OS ne s'embête pas à faire le distinguo fichier binaire/fichier texte (pour lui, tout est binaire).

    PS: le flag "r" n'existe pas avec open()...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre confirmé
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2009
    Messages : 61
    Par défaut Résolu
    Merci milles fois

    Tout est au poil maintenant

    S.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Slookeur Voir le message
    Merci milles fois

    Tout est au poil maintenant

    S.
    Pense à appuyer sur
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre confirmé
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2009
    Messages : 61
    Par défaut
    C'est ce que je voulais faire, mais il se trouve où se bouton ?

    Ok juste sous mon nez

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème fread() mauvaises valeurs
    Par Aymarick dans le forum Bibliothèque standard
    Réponses: 8
    Dernier message: 14/05/2008, 22h58
  2. Problème avec MinGW
    Par giminik dans le forum MinGW
    Réponses: 2
    Dernier message: 24/05/2007, 19h33
  3. complex.h difference mingw(win32) et g++(linux)
    Par reptils dans le forum Autres éditeurs
    Réponses: 8
    Dernier message: 22/11/2006, 10h41
  4. [Débutant] Problème avec Lcc-Win32
    Par rrafAel dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 11/10/2006, 18h16
  5. [VC++ Express] Problème de compilation win32.
    Par fab29000 dans le forum MFC
    Réponses: 1
    Dernier message: 15/02/2006, 20h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo