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

使用fscanf()读取文件的下一行,c,C,我使用两个函数从文件中读取double(read_double)和integer(read_integer)。 文件格式如下所示,不包括()中的字符 文件中有5个条目要读取 #include <stdio.h> double read_double(FILE *infile) { double double1=0.0; fscanf(infile, "%lf",&double1); return double1; } int read_intege

我使用两个函数从文件中读取double(read_double)和integer(read_integer)。 文件格式如下所示,不包括()中的字符

文件中有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;
}
#包括
双重读取(文件*infle)
{
双双1=0.0;
fscanf(填充、%lf、&double1);
返回双1;
}
int read_integer(文件*infle)
{
int1=0;
fscanf(填充、%d、&int1);
返回int1;
}
内部主(空)
{
文件*inp,*outp;
双gpa1=0.0;
int id1=0;
inp=fopen(“input.txt”,“r”);
outp=fopen(“output.txt”,“w”);
id1=读取整数(inp);
gpa1=读双精度(inp);
printf(“%d,%.2lf”,id1,gpa1);
返回0;
}
当此代码运行时,它打印学生ID,即12345678,然后打印1.00。这是因为它首先再次读取ID

我如何让它读取第二行并返回GPA(3.78)

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


注:我将不得不这样做5次。此外,我们还没有“学习while语句或“get()”,因此请尽量不要使用这些或更复杂的方法。

根据注释,您需要的是在库和主中拆分程序。 因此,图书馆将具有两个功能:

/* 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;

}
现在,输入文件是:

12345678
3.78
3
20.5
我们运行这个程序:

./program

12345678, 3.78
现在,如果我们从main中删除
#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;
}
那么结果是错误的:

./program

12345678, 1.0

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

代码在我的计算机上运行良好。我删除了未使用的变量(并删除了行开头的
output.txt
,它无论如何都不会使用),它编译时没有错误或警告,即使使用
-Wall
,也会打印12345678,然后打印3.78。我在Linux上使用的是gcc 4.9.1。@当您调用read_integer()和read_double()时,Jay就是这样从头文件?我不明白你的意思…什么头文件?:-)我编译了它,然后把值放在一个名为
input.txt
的文件中并运行它。结果是正确的。我的类要求我使用一个头文件和两个源文件。所以read_integer()和read_double()的原型位于我的header.h文件中。然后在main()中调用它们。哦,我明白了。您想将代码拆分为“library”(读取函数)和“main”。这以前不清楚。是否正确?我收到一个错误,说“Stack around variable int1已损坏”然后它返回-1073741824,3.78。即使使用
#include“lib.h”
行,您是否也会收到该错误?你使用什么系统和编译器?你是怎么编译的?找到了!将其打印为长浮点而不是整型
12345678
3.78
3
20.5
./program

12345678, 3.78
#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