mauvaise lecture d'un fichier
	
	
		Bonjour, je désire lire des informations concernant un espèce chimique. Cette espèce est définie par un nom (name), une masse molaire (M), une température critique (T) et 2*7 coefficients. Voici mon fichier donnees.txt 
	Code:
	
| 12
 3
 4
 5
 
 |  
CH3
12.5 1000.2
12.3 45.2 10.2 45.3 63.22 78 45.1
45.0 56.3 78.98 56.32 478.63 56.32 896.3 | 
 je veux lire ces données et les afficher à l'écran (pour un début en tout cas). Voici mon prgm
	Code:
	
| 12
 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
 
 |  
#include<stdlib.h>
#include<stdio.h>
 
int main()
{
    int i,j;
    double var,M,T;
    char name[10];
 
    FILE * file=fopen("donnees.txt","r");
 
    for(i=0;i<1;++i)
    {
	switch(i)
	{
	    case 0 : fscanf(file,"%s",name);
		printf("name = %s\n",name);
		break;
	    case 1 : fscanf(file,"%lf%lf",&M,&T);
		printf("%f\t%f\n",M,T);
		break;
	    case 2 : for(j=0;j<7;++j)
	    {
		fscanf(file,"%lf",&var);
		printf("%f\t",var);
	    }
		printf("\n");
		break;
	    case 3 : for(j=0;j<7;++j)
	    {
		fscanf(file,"%lf",&var);
		printf("%f\t",var);
	    }
		printf("\n");
		break;
	} // fin du switch
    } // fin du for
 
    fclose(file);
 
    return 0;
} | 
 Mais la sortie est bizarre. J'obtiens :
	Code:
	
| 12
 3
 4
 5
 
 |  
name = //CH3
12.500000       1000.200000
12.300000       45.200000       10.200000       45.300000       63.220000       78.000000       45.100000
45.000000       56.300000       78.980000       56.320000       478.630000      56.320000       896.300000 | 
 Pourquoi ai-je name=//CH3 ? et non pas name=CH3 ??
J'ai esayé avec char * name, mais le compilo me renvoie une erreur de segmentation.
D'où peut provenir cette erreur (ou ce mauvais affichage) ?
Merci.
	 
	
	
	
		Re: mauvaise lecture d'un fichier
	
	
		
	Citation:
	
		
		
			
				Envoyé par salseropom
				
			
			Pourquoi ai-je name=//CH3 ? et non pas name=CH3 ??
			
		
	 
 Avec ton code, on a pas du tout ça...
Correction, sécurisation : (pose des questions si tu ne comprends pas)
	Code:
	
| 12
 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
 
 |  
#include <stdlib.h>
#include <stdio.h>
 
#define fname "../../data/data.txt"
 
int main ()
{
   FILE *file = fopen (fname, "r");
 
/* -ed- fopen() peut echouer... */
   if (file != NULL)
   {
      int i = 0;
      int err = 0;
 
      /* -ed-
         Un compteur de lignes sans gestion d'erreur est insuffisant.
       */
      while (!err)
      {
         int n;
 
         switch (i)
         {
         case 0:
            /* -ed-
 
               fscanf (file, "%s", name);
 
               fscanf() est peu recommande.
               De plus, il peut echouer.
               Ajoute gestion d'erreur.
             */
            {
               char name[10];
 
               n = fscanf (file, "%9s", name);
 
               if (n != 1)
               {
                  err = 1;
               }
               else
               {
                  printf ("name = %s\n", name);
               }
            }
            i = 1;
            break;
 
         case 1:
            {
               double M, T;
               n = fscanf (file, "%lf%lf", &M, &T);
               if (n != 2)
               {
                  err = 1;
               }
               else
               {
                  printf ("%8.2f%8.2f\n", M, T);
               }
            }
            i = 2;
            break;
 
         case 2:
            while (!err)
            {
               double var;
               n = fscanf (file, "%lf", &var);
               if (n != 1)
               {
                  err = 1;
               }
               else
               {
                  printf ("%8.2f", var);
               }
            }
            printf ("\n");
            i = 3;
 
            break;
 
         case 3:
            while (!err)
            {
               double var;
               n = fscanf (file, "%lf", &var);
               if (n != 1)
               {
                  err = 1;
               }
               else
               {
                  printf ("%8.2f", var);
               }
            }
            printf ("\n");
            break;
         }                      // fin du switch
 
      }                         // fin du for
 
      if (err)
      {
         if (ferror (file))
         {
            perror (fname);
         }
         else if (feof (file))
         {
            printf ("OK\n");
         }
         else
         {
            printf ("format error\n");
         }
      }
      fclose (file);
 
   }
   else
   {
      perror (fname);
   }
   return 0;
} | 
 qui donne
	Code:
	
| 12
 3
 4
 5
 6
 
 |  
name = CH3
   12.50 1000.20
   12.30   45.20   10.20   45.30   63.22   78.00   45.10   45.00   56.30   78.98
   56.32  478.63   56.32  896.30
OK |