我在阅读文件的语法方面遇到了麻烦,请帮忙吗?

时间:2013-05-23 02:19:04

标签: c file

我必须编写一个打开文件并读取每一行的程序,直到达到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

2 个答案:

答案 0 :(得分:3)

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

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

    int is_positive(double x, double y)
    
  3. 第32行的语法错误再次为FILE *


  4. 将文件名和打开模式传递给函数然后忽略它们似乎很奇怪。

    #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(),但xy均未初始化。因此,对create_point()的呼吁将会造成严重破坏。如果你读到xy,那么使用create_point()会有一些意义。您的输出将同时运行两个数字,并且最后不包含换行符。您的输入检查应该是您读取两个值。如果你输入一个输入流的字母,循环将运行很长时间,因为fscanf()将返回0(不是EOF)。此外,如果您有一个非正点,则进入无限循环,因为在跳过输出时没有读取新点。您也会遇到xyp.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版本。

答案 1 :(得分:0)

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