我必须编写一个打开文件并读取每一行的程序,直到达到EOF。文件中的每一行都有两个双精度值,表示二维空间中的一个点。对于这些线中的每一条,读取两个值,创建一个点,如果它位于坐标平面的第一个象限中,则打印该点。
好!所以这是我的代码:
#include <stdlib.h>
#include "point.h"
FILE *open_file(char const name[], char const mode[])
{
FILE *file;
file = fopen("test_points.txt", "r");
if (file == NULL)
{
perror("Error!\n");
}
return file;
}
int point is_positive(double x, double y)
{
struct point p;
int a;
if (p.x >= 0 && p.y >= 0)
{
a = 1;
}
else
{
a = 0;
}
return a;
}
void point_in_Q1(FILE *in, FILE *out)
{
struct point p;
double check, x, y;
check = fscanf(in, "%lf%lf", &p.x, &p.y);
p = create_point(x, y);
while (check != EOF)
{
if (is_positive(x, y) == 1)
{
fprintf(out, "%lf%lf", p.x, p.y);
check = fscanf(in, "%lf%lf", &p.x, &p.y);
}
}
}
所以这一次,我检查了两点是否是积极的,如果是,我把这些值打印出来。但是我在编译时遇到这个错误,我不知道为什么。
file.c:4: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
file.c:16: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘is_positive’
file.c:32: error: expected ‘)’ before ‘*’ token
答案 0 :(得分:3)
第4行的编译错误是因为你没有包含<stdio.h>
所以编译器不知道FILE *
是什么。
第16行的编译错误是因为您有两个类型名称(int
和point
)作为返回类型。你需要:
int is_positive(double x, double y)
第32行的语法错误再次为FILE *
。
将文件名和打开模式传递给函数然后忽略它们似乎很奇怪。
#include <stdlib.h>
#include <stdio.h>
#include "point.h"
FILE *open_file(char const name[], char const mode[])
{
FILE *file = fopen(name, mode);
if (file == NULL)
perror("Error!\n");
return file;
}
您的未初始化变量存在问题:
int point is_positive(double x, double y)
{
struct point p;
int a;
if (p.x >= 0 && p.y >= 0)
由于您尚未初始化p
,您将遇到麻烦(以不可靠的答案形式)。从表面上看,你可以简单地写一下:
int is_positive(double x, double y)
{
return (x >= 0.0 && y >= 0.0);
}
或者您可以使用:
int is_positive(double x, double y)
{
point p = { x, y };
if (p.x >= 0.0 && p.y >= 0.0)
return 1;
else
return 0;
}
或者你可以传递一点:
int is_positive(point p)
{
if (p.x >= 0.0 && p.y >= 0.0)
return 1;
else
return 0;
}
或者再次缩写为:
int is_positive(point p)
{
return (p.x >= 0.0 && p.y >= 0.0);
}
你的其他功能基本上没问题,但在某些地方有点古怪:
void point_in_Q1(FILE *in, FILE *out)
{
struct point p;
double check, x, y;
check = fscanf(in, "%lf%lf", &p.x, &p.y); // fscanf() returns an int
p = create_point(x, y); // What does this do?
while (check != EOF)
{
if (is_positive(x, y) == 1)
{
fprintf(out, "%lf%lf", p.x, p.y);
check = fscanf(in, "%lf%lf", &p.x, &p.y);
}
}
}
请注意,调用p
初始化了fscanf()
,但x
和y
均未初始化。因此,对create_point()
的呼吁将会造成严重破坏。如果你读到x
和y
,那么使用create_point()
会有一些意义。您的输出将同时运行两个数字,并且最后不包含换行符。您的输入检查应该是您读取两个值。如果你输入一个输入流的字母,循环将运行很长时间,因为fscanf()
将返回0(不是EOF)。此外,如果您有一个非正点,则进入无限循环,因为在跳过输出时没有读取新点。您也会遇到x
和y
与p.x
和p.y
再次出现问题。
最好写成:
void point_in_Q1(FILE *in, FILE *out)
{
struct point p;
while (fscanf(in, "%lf %lf", &p.x, &p.y) == 2)
{
if (is_positive(p) == 1)
fprintf(out, "(%lf, %lf)\n", p.x, p.y);
}
}
显然,您可以改变输出格式以适合自己。此代码使用int is_positive(point p);
函数的is_positive
版本。
答案 1 :(得分:0)
包括<stdio.h>
应解决您的问题,因为此头文件中定义了FILE