2014-09-20 32 views
-2

我有一个数据文件
我怎样才能fscanf()一个特定的类型?

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值?
我必须使用一个函数0123'的值,我不能只是
fscanf(infile, "%lf%lf", &unsaved, &save);
请帮助我,谢谢!

+1

'的fscanf(infile中, “%* LF%LF%* LF%* LF”,&save); ' – BLUEPIXY 2014-09-20 23:15:51

+0

使用'fgets'来读取文件中的行,'sscanf'来转换您关心的行上的值。 – user3386109 2014-09-20 23:16:14

回答

0

为只读GPAfscanf格式字符串附加参数赋值抑制,则需要类似fscanf (fp, "%*lf%lf%*s%*lf%*lf*", &save);格式字符串。您必须考虑数据块中的刺痛字符,否则您将遇到输入故障fscanf。在一个函数使用fscanf隔离GPA的一个例子是:

#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