问题描述
我正在尝试使用 c89
读取 scanf
中的 CSV 文件:
FOO,2,3
BAR,5,4
...
这是我尝试过的:
#include <stdio.h>
int main() {
char code[10];
double a,b;
while( scanf("%s,%lf,%lf",code,&a,&b)!=EOF ) {
printf("> %s\n",code);
printf("> %s,%lf\n",a,b);
}
return 0;
}
这是我得到的输出:
$ ./a.out
A,3
> A,3,0.000000,0.000000
B,4
> B,4,0.000000
$
$ ./a.out
A,3
> A
> A,2.000000,3.000000
B,4
> B
> B,5.000000,4.000000
$
编辑
根据我尝试过的评论:
#include <stdio.h>
int main() {
char code[10];
double a,b;
while( scanf("%9[^,],b);
}
return 0;
}
我得到:
$ cat > test.txt
A,3
B,5
C,6
$ cat test.txt | ./a.out
> A
> A,3.000000
>
B
>
B,4.000000,5.000000
>
C
>
C,6.000000
>
>,6.000000
$
显然第一条记录得到了正确处理,但随后的记录没有得到正确处理。
另外,我对 9
的作用以及整个 %9[^,]
是否是 c89
的一部分有疑问。
解决方法
我找到了一种解决方法,将每一行放入缓冲区并先用空格替换逗号,然后应用 %s
。
#include <stdio.h>
int main() {
char line[256];
char code[10];
double a,b;
while(scanf("%s",line) != EOF) {
/* REPLACE ALL,BY SPACES TO SIMPLIFY SCANF USAGE */
char *p = line;
while(*p!='\0') {
if(*p==',') {
*p = ' ';
}
p++;
}
sscanf(line,"%s %lf %lf",code,&a,&b);
printf("> %s\n",code);
printf("> %s,%lf,%lf\n",a,b);
}
return 0;
}
不确定它是否是最优雅的解决方案,但提高了 scanf 部分的可读性。