fgets不起作用 -

时间:2016-12-06 20:27:07

标签: c file-io fgets

突然fgets停止工作,而我还没有做任何会影响功能的改变 这是我的代码。请告诉我为什么它不起作用!

  void readInfo()
{struct grades *grades=malloc(3*sizeof(grades));
   char line[60],str[6];
   int i=0;

   FILE *rf=fopen("Grades.txt","r");
   if(!feof(rf)&&fgets(line,60,rf)!=NULL)

   {           puts("inside if1");


         while(i<3)
         {

             sscanf(line,"%d %s %c",&(grades[i]).ID,str,&(grades[i].grade));
            strcpy(str,((*(grades+i)).course));
                        i++;
            printInfo(grades+i);puts("herwr");
         }

   }
   fclose(rf);
}

********* CODE EDITED

1 个答案:

答案 0 :(得分:1)

这里重写了您的代码:

未编译,更少测试。

void readInfo(void)
{    
    int i = 0;
    FILE *rf = fopen("Grades.txt", "r");
    if (rf != NULL)
    {
        char line[1024];
        while (fgets(line, sizeof(line), rf) != NULL)
        {
            struct grades grade;
            puts("inside while");
            if (sscanf(line, "%d %s %c", &grade.ID, grade.course, &grade.grade) == 3)
            {
                i++;
                printInfo(&grade);
            }
        }
        puts("here");
        fclose(rf);
    }
    printf("%d grades accepted\n", i);
}

更改包括:

  • 不为成绩分配数组 - 您永远不会重复使用该值。
  • 缺少free()没问题。
  • 测试文件是否已打开。
  • 如果文件未打开,请勿尝试关闭该文件。
  • 允许更大的线条 - 它是无痛的并且避免出现问题。
  • 检查sscanf()是否成功。
  • 打印接受的成绩数量。

其他可能性:

  • 删除诊断打印件。它们是暂时的,但是当事情没有按照您的意愿工作时可能会有用。
  • 如果文件名作为参数传递给函数会更好。
  • 如果文件无法打开(并且邮件应包含文件名),则可能会更好,如果有错误报告,通常会写入标准错误。
  • 如果您想要处理最多三个等级线,您可以这样做。
  • 如果您想处理无限数量的等级线,您可以这样做。
  • 如果你想返回成绩数组,你可以这样做(但你怎么说数组有多大 - 有多种可能性)。

所有这些都需要对编码进行一些更改,但没有什么非常复杂的。