C 关闭文件时出现分段错误

C 关闭文件时出现分段错误,c,file,pointers,fault,C,File,Pointers,Fault,全部, 我在试图弄明白为什么我总是遇到这些分割错误时,经历了一段糟糕的时光。我试图在服务器上打开一个文件,从中读取,然后关闭它。在我试图关闭文件之前,一切似乎都很顺利。这些子程序从同一程序中一次调用一个。调用monthly rain时,它会使用下面的代码为指针打印一个值22。每天下雨时,指针值打印为(null)。如果任一fclose未注释,程序将停止工作,并在到达fclose行时显示分段故障。我在两个例程中打开同一个文件。一般来说,月雨在日雨之前。如果您需要更多信息,请咨询,我们非常感谢您的帮助

全部,

我在试图弄明白为什么我总是遇到这些分割错误时,经历了一段糟糕的时光。我试图在服务器上打开一个文件,从中读取,然后关闭它。在我试图关闭文件之前,一切似乎都很顺利。这些子程序从同一程序中一次调用一个。调用monthly rain时,它会使用下面的代码为指针打印一个值22。每天下雨时,指针值打印为(null)。如果任一fclose未注释,程序将停止工作,并在到达fclose行时显示分段故障。我在两个例程中打开同一个文件。一般来说,月雨在日雨之前。如果您需要更多信息,请咨询,我们非常感谢您的帮助

程序如下:

float monthly_rain(int year, int month)
{   
    float mon_rain=0, mrain, rain1, rain2, d, cur_hour=0, day;
    char filename[size];
    FILE *afile;

    //calculates monthly rainfail
    for(d=1;d<day;d++)
    {
        sprintf(filename, "%s%4d%02d%02d.dat",ARCHIVEDIR,year,month);   //step through the days of the month(d not mday)
        printf("\nFilename is = %s\n", filename);
        if((afile=fopen(filename, "r"))!= NULL)
        {
            if(d==1)    //Get first reading of the month - total rain is 9th column 
                mrain = fscanf( afile, "%*d:%*d%*d%*d%*d%*d%*d%*d%*d%d%*d%*d%*d%*d%*d", &rain1); 
            else    //scan till you reach the last day of the month
            {   //Step through the columns, exit when last day reached
                cur_hour=0;     //resets current hour counter for each new day
                while ((mrain = fscanf( afile, "%*d:%*d%*d%*d%*d%*d%*d%*d%*d%d%*d%*d%*d%*d%*d%*c", &rain2))!= -1)   
                    cur_hour++;     //probable wont need this till daily calculation, unless we really want it in monthly too.
            }
        }
    }
    mon_rain=(rain2*.01)-(rain1*.01);   //Save the monthly reading
    printf("\nMon rain as in func. %.2f\n", mon_rain);
    printf("\npointer = %d\n", afile);  
    //fclose(afile);
    printf("\n\nflag 1\n\n");
    return mon_rain;
}//end monthly rainfall calc.
一些补充有助于澄清一些问题

%*d占位符用于忽略下一个整数。我正在读15列数据文件中的第9列。到目前为止,我在获取数据方面没有遇到任何问题。尺寸也定义为100


再次感谢。

这里有很多问题

只有在成功地
fopen()
删除文件时,才应尝试
fclose()
该文件。改为:

    if((afile=fopen(filename, "r"))!= NULL)
    {
        if(d==1)
            mrain = fscanf( afile, "%*d:%*d%*d%*d%*d%*d%*d%*d%*d%d%*d%*d%*d%*d%*d", &rain1); 
        else 
        { 
            cur_hour=0; 
            while ((mrain = fscanf( afile, "%*d:%*d%*d%*d%*d%*d%*d%*d%*d%d%*d%*d%*d%*d%*d%*c", &rain2))!= -1)   
                cur_hour++;
        }

        fclose(afile);  /*  <---- close it here, not at the end  */
    }

day
未初始化,因此此循环可能会运行很长很长时间。

“%*d:%*d%*d%*d%*d%*d%*d%*d%*d%*d%*d%*d%*d%*d%*d%*d%*d%*c”你在那里做什么?@MikeDinescu:我想知道同样的情况,但那里实际上有一个单独的
%d
?如果它是负数或零,这是不好的,如果它太大,可能会导致堆栈溢出。将
sprintf(filename
更改为
snprintf(filename,sizeof filename
在此代码块中,从:If((afile=fopen(filename,“r”)!=NULL开始)代码无法处理“afile”为NULL的情况,而只是跳到代码块后的下一行并继续运行。
while((mrain=fscanf(afile,%*d:%*d..%*d%*c,&rain2))!=-1)
不保证
rain2
被赋值。而
rain2
是一个
float
。同意:OP post中存在许多问题“.Paul,谢谢你的帮助。我做了你建议的更改,效果很好!我本应该看到这些错误,但我很高兴你能提供帮助。Day从main传递到函数中,是当月的实际日期。@Rdemps:Not in
monthly\u rain()
,不是,你在第一行定义了
天,但从未初始化它。你在这里绝对是正确的,保罗。我在回来之前做了更改。一定是在我发布这篇文章之后。我想我发现了这个错误,这很好。
    if((afile=fopen(filename, "r"))!= NULL)
    {
        if(d==1)
            mrain = fscanf( afile, "%*d:%*d%*d%*d%*d%*d%*d%*d%*d%d%*d%*d%*d%*d%*d", &rain1); 
        else 
        { 
            cur_hour=0; 
            while ((mrain = fscanf( afile, "%*d:%*d%*d%*d%*d%*d%*d%*d%*d%d%*d%*d%*d%*d%*d%*c", &rain2))!= -1)   
                cur_hour++;
        }

        fclose(afile);  /*  <---- close it here, not at the end  */
    }
for(d=1;d<day;d++)