对不同类型的`fscanf()`使用switch case

时间:2017-01-01 12:15:05

标签: c file text switch-statement scanf

问题:

我写了一个C程序,它应该遍历一个输入文件并在一个相同布局的表格中显示它的表格内容,除了输入文件,输出的值应该是很好的均匀标签列。

我正在阅读的文字文件包含以下内容:

  

姓氏123 4.2 f
   sara dddd 222 3.2 f
   dan ssss 1233 1.3 m
   ann aaaa 443 2.2 f

但输出错误:

output

注意不需要的换行,其中应该在最后一列显示的值成为下一行的第一列。

该计划:

    int i, j;
    char c;
    double d;
    char str[10];
    char t[6]="ssidc"; //Encoded column types descriptor (e.g. string, string, int, double, char"

    while(!feof(fa)) {

    for(i = 0; i < 5; i++) {
        switch(t[i]) {
            case('s'): 
                fscanf(fa,"%s",str);
                printf("%s\t",str);
                break;
            case('c'):
                fscanf(fa,"%c",&c);
                printf("%c\t",c);
                break;
            case('d'):
                fscanf(fa,"%lf",&d);
                printf("%.1lf\t",d);
                break;
            case('i'):
                fscanf(fa,"%d",&j);
                printf("%d\t",j);
                break;
            default:
                break;
        }
    }
    printf("\n");//new line
}

1 个答案:

答案 0 :(得分:1)

scanf("%c"读取任何字符,但是当你调用它时,当前位置在空格上(你只是解析了一个浮点数),然后它被读作字符。您需要通过提供扩展格式处理指令来跳过它:

fscanf(fa,"%*[ ]%c",&c);

阅读scanf手册以了解其工作原理。