如何读取不同格式的行

时间:2016-10-19 22:35:00

标签: c string input format

我有一个输入文件,其格式如下

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 ..]

1 个答案:

答案 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()会在不匹配时快速退出。

替代方案,代码可以解析出更有效的决策树的首字母。怀疑分析将显示出很小的性能差异。

与任何复杂格式一样,请考虑如何维护代码并且它必然会发展。