我如何fscanf()特定类型?

时间:2014-09-20 23:11:37

标签: c

我有一个数据文件

12345678
3.78 <<GPA
3
20.5

87654321
2.65 <<GPA
2
19.25

08651234
3.10 <<GPA
1
18.0

11112222
3.95 <<GPA
4
22.5

22223234
2.45 <<GPA
3
19.3333

我应该怎样做才能fscanf()所有GPA值? 我必须使用函数来fscanf()值,我不能只是fscanf(infile, "%lf%lf", &unsaved, &save);
请帮助我,谢谢!

1 个答案:

答案 0 :(得分:0)

为了在GPA格式字符串中只读取fscanf 分配抑制其他参数,您需要一个类似于fscanf (fp, "%*lf%lf%*s%*lf%*lf*", &save);的格式字符串。您必须考虑数据块中的sting字符,否则您将遇到{strong>输入失败 fscanf。在函数中使用GPA隔离fscanf的示例如下:

#include <stdio.h>
#include <stdlib.h>

void readgpa (char *filenm)
{
    FILE *fp = fopen (filenm, "r");
    if (!fp) {
        fprintf (stderr, "\n  Error, invalid filename '%s'\n\n", filenm);
        exit (1);
    }

    int cnt = 0;
    double save;

    while (fscanf (fp, "%*lf%lf%*s%*lf%*lf*", &save) != -1)
    {
        cnt++;
        printf (" line: %d    GPA: %.2f\n", cnt, save);
    }

    if (fp) fclose (fp);

}

int main (int argc, char **argv) {

    if (argc < 2) {
        fprintf (stderr, "\n  Error, insufficient input. Usage: %s filename\n\n", argv[0]);
        return 1;
    }

    readgpa (argv[1]);

    return 0;
}

<强>输出:

$ ./bin/gpa dat/gpa.dat
 line: 1    GPA: 3.78
 line: 2    GPA: 2.65
 line: 3    GPA: 3.10
 line: 4    GPA: 3.95
 line: 5    GPA: 2.45