如何在不知道浮动长度的情况下fscanf?

时间:2013-11-28 16:05:01

标签: c++ c decimal scanf

我想扫描数据文件中的“G1”,然后是浮点数中给出的X,Y和Z坐标,但坐标用不同的小数位数表示。文件中的三行可能看起来像,第一行和第三行包含坐标:

    G1X59.7421875Y60.2578125
    M101S3F12
    G1X50.25

有谁知道fscanf如何以不可预测的性质浮动? 当我查看结果(printf())时,数字与文件不匹配。我希望fscanf扫描“通过”短浮点数,因为它们没有打印。

我遍历行的代码:注意函数调用find_arg(),我认为问题出在哪里。

char line[LINE_LENGHT];
int G1, X, Y, Z, F, junk= 0;
float fdx, fdy, fdz;

while(!feof(file_gcode)){
   for (i = 0; i < LINE_LENGHT; i++){
      fscanf(file_gcode, "%c", &line[i]);
      if ((line[i-1] == 'G')&&(line[i] == '1')) {
         G1 ++;
         while (line[i] != '\n'){
            if( (line[i] == 'X') || (line[i]==('Y')) || (line[i]==('Z')) || (line[i] == ('F')) ) {
               find_arg(line[i]);
            }
            i ++;
            fscanf(file_gcode, "%c", &line[i]);
         }
         printf("X = %f, Y = %f, Z = %f \n", fdx, fdy, fdz);
      }
   }
}
printf("-------------------\n");
printf("G1's : %i\n", G1);
printf("X's : %i\n", X);
printf("Y's : %i\n", Y);
printf("Z's : %i\n", Z);
printf("F's : %i\n", F);
printf("other's : %i\n", junk);
printf("-------------------\n");
}

int find_arg(char c){
   if (c == 'X'){
      X ++;
      fscanf(file_gcode, "%f", &fdx);
   }
   else if(c == 'Y'){
      Y ++;
      fscanf(file_gcode, "%f", &fdy);
   }
   else if(c == 'Z'){
      Z ++;
      fscanf(file_gcode, "%f", &fdz);
   }
   else if(c == 'F'){
      F ++;
   }
   else junk ++;
}

2 个答案:

答案 0 :(得分:1)

float x, y, z;
int nread;
nread = fscanf(fp, "G1X%fY%fZ%f", &x, &y, &z);

nread将是扫描的坐标数。因此,如果该行只有XY,那么它将为2。

答案 1 :(得分:0)

您可以使用strtok来解析输入行 - 这会将您关注的字符串中的位分开。它消除了对字符串格式的一些依赖 - 但如果您的字符串格式众所周知,@ Barmar的解决方案应该可以正常工作。

这样的事情可能是一个可行的选择:

nextLine = fgets(fp);
// check line has "G1" in it:
if(strstr(nextLine, "G1)!=NULL) {
// look for 'X':
  strtok(nextLine, "X");
// find the thing between 'X' and 'Y':
  xString = strtok(NULL, "Y");
  if(xString != NULL) sscanf(xString, "%f", &xCoordinate);
// find the thing to the end of the line:
  yString = strtok(NULL, "\n");
  if(yString != NULL) sscanf(yString, "%f", &yCoordinate);
}