我使用两个函数从文件中读取双精度数(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;所以请尽量不要使用这些或更复杂的方法。
答案 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
因为编译器生成的代码假定所有函数都返回整数。在内部,双打和整数以完全不同的方式表示。