matlab按行读字符串,Matlab按行读取数据的方法

最近要处理一些机械制造时用到的G代码,想要按行来读取,因为G1后面直接就是坐标,读取出来就很方便使用了。

处理的数据片段如下:

G90

G21

M103

M105

M106

M140 S60.0

M141 S30.0

M142 S0.0

M113 S1.0

M108 S210.0

M104 S200.0

G1 X-57.6 Y-30.312 Z0.72 F60.0

M101

G1 X-57.6 Y30.312 Z0.72 F240.0

G1 X-54.72 Y30.312 Z0.72 F240.0

...(都是G1了,所以省略了)

G1 X48.96 Y-30.312 Z0.72 F240.0

G1 X51.84 Y-30.312 Z0.72 F240.0

G1 X51.84 Y30.312 Z0.72 F240.0

G1 X54.72 Y30.312 Z0.72 F240.0

G1 X54.72 Y-30.312 Z0.72 F240.0

G1 X57.6 Y-30.312 Z0.72 F240.0

G1 X57.6 Y30.312 Z0.72 F240.0

M103

M108 S210.0

G1 X-57.636 Y0.0 Z1.18 F960.0

M101

G1 X57.636 Y0.0 Z1.18 F960.0

G1 X57.636 Y-1.44 Z1.18 F960.0

G1 X-57.636 Y-1.44 Z1.18 F960.0

G1 X-57.636 Y-2.88 Z1.18 F960.0

G1 X57.636 Y-2.88 Z1.18 F960.0

G1 X57.636 Y-4.32 Z1.18 F960.0

G1 X-57.636 Y-4.32 Z1.18 F960.0

G1 X-57.636 Y-5.76 Z1.18 F960.0

....

以上文件存为“test.txt”

处理:

结果:

0818b9ca8b590ca3270a3433284dd417.png

特别提醒两个函数的用法:

1.strncmp比较两个字符串前n个字符是否相等,是,返回真,否则,返回假

我一开始用的是strcmp,由于g代码中的M101与M103那一行的格式并不完全一致,有的在这四个字符后加了空格,有的好像加了回车符,特别不好处理。好在这里只需要以前四个字符作为标志就可以判断了,所以strncmp非常适合。

2. fgets

可以用于一行一行地读取,类似的还有fgetl。

代码解释:

以上代码中的设计思想,最重要的是按行读取之后,以X为标志开始坐标的读取,只要读入的字符在0到9之间或者是负号或者小数点就读入,如果不是则跳过。

以上代码处理坐标读入时,一开始写了X, Y, Z分别处理的三个类似的if加上while的片段,但是只有第一个if被执行,后面的两个if好像都没起作用,怀疑是坐标之间有奇怪字符使得无法运行。现在正常工作的这个代码也不是最高效的,第31行的while与第36行的只相差一个~,其实可以合并的,但是这又要识别X, Y, Z了,又有点麻烦了。暂时先就这样吧。

你可能感兴趣的:(matlab按行读字符串)