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.