我想扫描数据文件中的“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 ++;
}
答案 0 :(得分:1)
float x, y, z;
int nread;
nread = fscanf(fp, "G1X%fY%fZ%f", &x, &y, &z);
nread
将是扫描的坐标数。因此,如果该行只有X
和Y
,那么它将为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);
}