gpt4 book ai didi

c - 关闭文件时出现 Segmentation Fault 错误

转载 作者:太空宇宙 更新时间:2023-11-04 03:43:48 27 4
gpt4 key购买 nike

全部,

我很难弄清楚为什么我总是遇到这些段错误。我试图在服务器上打开一个文件,从中读取,然后关闭它。在我尝试关闭文件之前,一切似乎都很顺利。这些子例程从同一个程序中一次调用一个。当调用 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.

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

//daily rainfall calc.
sprintf(filename, "%s%4d%02d%02d.dat",ARCHIVEDIR, year, month, day); //get the current days archive file
printf("\nFilename is = %s\n", filename);
if((afile=fopen(filename, "r"))!= NULL) //open the file
{
//Step through the columns, exit when last day reached
while ((mrain = fscanf( afile, "%*d:%*d%*d%*d%*d%*d%*d%*d%*d%d%*d%*d%*d%*d%*d%*c", &rain2))!= -1)
{
if(cur_hour==0)
rain1=rain2; //save the first reading of the day
cur_hour++;
}
}
daily_rain=(rain2*.01)-(rain1*.01); //the daily rainfall saved here
printf("\nDaily rain as in func. %.2f\n", daily_rain);
printf("\npointer = %s\n", afile);
//fclose(afile);
return daily_rain;
}//end daily 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 */
}

目前,在所有情况下,您的代码所能做的最好的事情就是关闭您打开的最后一个文件。如果您将 afile 设置为 NULL 的最后一件事,您将会崩溃。

此外,如果您的 fopen() 调用失败,则不要继续您的其余逻辑。

例如,daily_rain=(rain2*.01)-(rain1*.01); 和您的 daily_rain() 中的 friend 将运行,即使您的文件没有未打开并且 rain1rain2 未初始化,这很糟糕。也将这些东西移到您的 if block 中,这样它只会在成功打开文件时运行。

您的循环也无法说明 fscanf() 可以返回 EOF 这一事实。现在,您似乎想在 fscanf() 返回 0 时终止,但如果它返回 EOF,您将继续前进。

还有,还有,当你这样调用它时:

for(d=1;d<day;d++)

day 未初始化,所以这个循环很可能会运行很长很长时间。

关于c - 关闭文件时出现 Segmentation Fault 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26499308/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com