我有一个输入文件,其格式如下
i 176064 Patterson Denise 8.58 11 DEN 15788
q 188464
ra 148702 167443
a 73131
d 163464
f 6.00
ct 73131 PHY
b 3
p 15703
pe
m 144626 6.51 8
e
每行中的第一个字符[i,q,ra,a ...]表示函数的代码,而其余的是我必须存储到变量中的值,具体取决于该代码。实现这一目标的最佳方法是什么?我一直在考虑使用fscanf,但每行都没有特定的格式,格式本身取决于代码[i,q,ra,a,b ..]
答案 0 :(得分:1)
要阅读行,请使用fgets()
char buffer[100];
while (fgets, buffer, sizeof buffer, istream) != NULL) {
然后根据各种格式扫描线条,每条格式都以" %n"
结尾。 "%n"
记录扫描位置,如果它到达那么远。其他测试可以从n
开始检查无关的额外字符。
int num1, num2, num3;
char last[sizeof buf];
char first[sizeof buf];
char code[sizeof buf];
double rate;
int n = 0;
// v..v..v..v...v..v..v spaces optional here
sscanf(buffer, "i %d %s %s %lf %d %s %d %n",
&num1, last, first, &rate, &num2, code, &num3, &n);
if (n) {
Handle_i();
continue;
}
sscanf(buffer, "q %d %n", &num1, &n);
if (n) {
Handle_q();
continue;
}
sscanf(buffer, "ra %d %n", &num1, &num2, &n);
if (n) {
Handle_ra();
continue;
}
sscanf(buffer, "e %n", &n);
if (n) {
Handle_e();
continue;
}
...
fail();
}
由于每种格式都以唯一的字母图案开头,sscanf()
会在不匹配时快速退出。
替代方案,代码可以解析出更有效的决策树的首字母。怀疑分析将显示出很小的性能差异。
与任何复杂格式一样,请考虑如何维护代码并且它必然会发展。