Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C fgets不';行不通-_C_File Io_Fgets - Fatal编程技术网

C fgets不';行不通-

C fgets不';行不通-,c,file-io,fgets,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) {

当我没有做任何会影响功能的更改时,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);
}
void readInfo()
{struct grades*grades=malloc(3*sizeof(grades));
字符行[60],str[6];
int i=0;
文件*rf=fopen(“Grades.txt”、“r”);
如果(!feof(rf)&&fgets(第60行,rf)!=NULL)
{puts(“内部if1”);

而(i这里是对代码的重写:

未编译,更不用说测试了

变化包括:

  • 不为等级分配数组-您永远不会重用该值
  • 缺少的
    free()
    没有问题
  • 正在测试文件是否已打开
  • 如果文件未打开,则不尝试关闭该文件
  • 允许更大的线-这是无痛的,避免了问题
  • 检查
    sscanf()
    是否成功
  • 打印接受的分数
其他可能性:

  • 删除诊断打印。它们是临时的,但在事情没有按您所希望的方式运行时可能有用
  • 最好将文件名作为参数传递给函数
  • 如果文件无法打开(并且消息应该包括文件名),如果有错误报告可能会更好,通常写入标准错误
  • 如果要处理多达三条坡率线,可以这样做
  • 如果要处理数量不定的坡面线,可以这样做
  • 如果你想返回等级数组,你可以这样做(但是你怎么说数组有多大?有多种可能性)

所有这些都需要对编码进行一些更改,尽管没有什么异常复杂。

fgets()
可以工作-您可能没有正确使用它,但是
fgets()
有效。请学习正统的缩进和布局样式。不要在一行上放多个语句。不要在一行上放多个右大括号。
fscanf
接受目标参数
str
,但
char*str
没有为其分配内存。使用
fgets()
读取一行是明智的,但是在循环中使用
fscanf()
读取下一行可能不是您想要的。这可能是对
sscanf()
的调用。您应该检查
scanf()中任何一个的返回值
你确实打电话给家人,以确保一切正常。使用下标符号(
&grades[i].grade
)比使用替代符号(
&(*(grades+i)).grade)
)更为清晰……奇怪的是,你继续使用你最近输入的
str
的东西(而且仍然没有分配内存)。
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);
}