2017-06-03 78 views
0

我有一个文件其结构如下:如何在此上下文中正确使用sscanf?

var1 2921 
var2 0.5 
var3 12 

我需要一个方法是获取文件和3个空变量的名称。它应该读取文件并给出每个变量的值。 (这是我到目前为止已经试过)

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++; 
     } 
    } 
} 

而且主要

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; 
} 

输出:

VAR1:8

VAR2:0.000000

v AR3:2011837489

+1

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

+1

一个问题是你不检查'sscanf()'的返回值,所以你不知道它何时失败。 –

+0

另一个是,如果'fopen'失败,你会从未初始化的变量报告,但没有告诉。 –

回答

3
  1. 对于双,你需要使用%lf,不%f;在scanf以及在printf。或者,您可以使用float,与%f一起使用。

  2. 您正在传递var1,2,3的地址;所以在scanf中再次获取地址是重复的 - 您将获得地址的地址。
    使用var1而不是&var1scanf之内。

+1

请注意,'printf()'用'%f'(经典符号)或'%lf'(C99或更高版本的符号)格式化'double'。不过,对于'scanf()'家族来说,这种差异至关重要。 –

相关问题