使用fscanf()读取文件的下一行

时间:2014-09-24 19:00:42

标签: c

我使用两个函数从文件中读取双精度数(read_double)和整数(read_integer)。 文件格式如下,不包括()'

中的字符
12345678   (ID)  
3.78       (GPA)   
3          (Year)   
20.5       (Age)

要读取的文件中有5个条目。

#include <stdio.h>

double read_double(FILE *infile)
{
    double double1=0.0;
    fscanf(infile, "%lf",&double1);
    return double1;
}

int read_integer(FILE *infile)
{
    int int1=0;
    fscanf(infile, "%d",&int1);
    return int1;

}

int main(void)
{
    FILE *inp,*outp;
    double gpa1=0.0;
    int id1=0;
    inp=fopen("input.txt","r");
    outp=fopen("output.txt","w");
    id1=read_integer(inp);
    gpa1=read_double(inp);
    printf("%d, %.2lf",id1,gpa1);
    return 0;
}

当此代码运行时,它会打印学生ID 12345678,然后打印1.00。这是因为它再次读取ID。

我如何阅读第二行并返回GPA(3.78)

我需要拆分程序,以便main在一个文件中,其他函数在另一个文件中。

注意:我必须这样做5次。我们还没有在语句中学习或者#34;得到()&#34;所以请尽量不要使用这些或更复杂的方法。

1 个答案:

答案 0 :(得分:2)

根据评论,你想要的是在库和主要分割程序。 因此,该库将具有两个功能:

/* lib.c */
#include <stdio.h>

double read_double(FILE *infile)
{
    double double1=0.0;
    fscanf(infile, "%lf",&double1);
    return double1;
}

int read_integer(FILE *infile)
{
    int int1=0;
    fscanf(infile, "%d",&int1);
    return int1;

}

头文件将帮助使用您的库的程序知道对函数的期望(应该使用哪些类型的参数和返回值)。它只包含原型,而不是实际的函数定义:

/* lib.h */
#include <stdio.h>

double read_double(FILE *infile);
int read_integer(FILE *infile);

主要使用它们:

/* main.c */
#include <stdio.h>
#include "lib.h"   /* <== here! use the prototypes so
                          the compiler will know that
                          read_double returns double! */

int main(void)
{
    FILE *inp;
    double gpa1=0.0;
    int id1=0;
    inp=fopen("input.txt","r");
    id1=read_integer(inp);
    gpa1=read_double(inp);
    printf("%d, %.2lf",id1,gpa1);
    return 0;
}

编译它们:

gcc lib.c main.c -o program

现在,输入文件是:

12345678
3.78
3
20.5

我们运行程序:

./program

12345678, 3.78

现在, if 我们从主

中删除了#include "lib.h"
#include <stdio.h>

int main(void)
{
    FILE *inp;
    double gpa1=0.0;
    int id1=0;
    inp=fopen("input.txt","r");
    id1=read_integer(inp);
    gpa1=read_double(inp);
    printf("%d, %.2lf",id1,gpa1);
    return 0;
}

并使用优化进行编译,

gcc -O3 lib.c main.c

然后结果是错误的:

./program

12345678, 1.0

因为编译器生成的代码假定所有函数都返回整数。在内部,双打和整数以完全不同的方式表示。