2017-06-03 8 views
0

Je dispose d'un fichier dont la structure est la suivante:Comment utiliser correctement sscanf dans ce contexte?

var1 2921 
var2 0.5 
var3 12 

je besoin d'une méthode qui obtient le nom du fichier et 3 variables vides. Il devrait lire le fichier et donner une valeur pour chaque variable. (C'est ce que je l'ai essayé jusqu'à présent)

void get_input(char * filename, int * var1, double * var2, int * var3){ 
    FILE *file; 
    char buf[1024]; 
    file=fopen(filename,"r"); 
    if(file == NULL){ 
     printf("ERROR"); 
     exit(0); 
    } 

    int i=0; 

    if(file){ 
     while(fgets(buf,sizeof(buf),file)!=NULL){  
      switch(i){ 
      case 0: 
       sscanf(buf,"var1 %d",&var1); 
       break; 
      case 1: 
       sscanf(buf,"var2 %f",&var2); 
       break; 
      case 2: 
       sscanf(buf,"var3 %d",&var3); 
       break; 
      default: 
       break; 
      } 

      i++; 
     } 
    } 
} 

Et la principale:

int main() 
{ 
    char filename[256]; 
    int var1,var3; 
    double var2; 

    snprintf(filename,256,"file.txt"); 

    get_input(filename,&var1,&var2,&var3); 

    printf("%s %d","var1: ",var1); 
    printf("%s %f","\nvar2: ",var2); 
    printf("%s %d","\nvar3: ",var3); 

    return 0; 
} 

Sortie:

var1: 8

var2: 0,000000

v ar3: 2011837489

+1

Pourquoi 'buf [strlen (buf) -1] = '\ 0';'? – qPCR4vir

+1

Un problème est que vous ne cochez pas la valeur de retour de 'sscanf()' si vous ne savez pas quand il échoue. –

+0

Une autre est que si 'fopen' échoue, vous déclarerez à partir de variables non initialisées, mais pas tell. –

Répondre

3
  1. Pour un double, vous devez utiliser %lf, non %f; dans scanf ainsi que dans printf. Alternativement, vous pouvez utiliser float, qui va avec %f.

  2. Vous passez les adresses de var1, 2, 3; Donc, en prenant l'adresse à nouveau dans scanf est en double - vous obtiendrez l'adresse de l'adresse.
    Utilisez var1 au lieu de &var1 à l'intérieur du scanf.

+1

Notez que 'printf()' 'formats double' soit avec'% f' (la notation classique) ou '% lf' (la notation C99 ou ultérieure). La différence est cruciale pour la famille 'scanf()', cependant. –