-1

我必须编写一个程序来打开文件并读取每一行,直到达到 EOF。文件中的每一行都有两个 double 值,表示二维空间中的一个点。对于每条线,读取两个值,创建一个点,如果该点位于坐标平面的第一象限,则打印该点。

好的!所以这是我的代码:

#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
4

2 回答 2

3
  1. 第 4 行的编译错误是因为你没有包含<stdio.h>所以编译器不知道 aFILE *是什么。

  2. 第 16 行的编译错误是因为您有两个类型名称 (intpoint) 作为返回类型。你需要:

    int is_positive(double x, double y)
    
  3. 第 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初始化。因此,调用 tocreate_point()将造成严重破坏。如果您阅读xand y,那么使用create_point(). 您的输出将同时运行这两个数字,并且最后不包含换行符。您的输入检查应该是您读取了两个值。如果您在输入流中输入了一个字母,则循环将运行很长时间,因为fscanf()将返回 0(不是 EOF)。此外,如果您有一个非正点,您将进入无限循环,因为您在跳过输出时没有读取新点。你也有问题xy对战。p.xp.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

于 2013-05-23T03:24:38.603 回答
0

包括<stdio.h>应该解决您的问题,因为 FILE 在此头文件中定义

于 2013-05-23T03:31:14.427 回答