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