首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fclose()引起分割故障

fclose()引起分割故障
EN

Stack Overflow用户
提问于 2014-03-19 12:52:11
回答 5查看 24.9K关注 0票数 12

我一直在尝试用C语言进行简单的文件处理,我希望确保可以使用以下方法访问该文件

代码语言:javascript
复制
#include<stdio.h>

main()
{
    CheckFile();
}

int CheckFile()
{
    int checkfile=0;

    FILE *fp1;
    fp1 = fopen("users.sav","r");

    if(fp1==NULL)
    {
        fopen("users.sav","w");
        fclose(fp1);
    }   
    if(checkfile!=0)printf("\nERROR ACCESSING FILE!\nNow exiting program with exit code: %d\n",checkfile);exit(1);
    return 0;
}

然后显示

代码语言:javascript
复制
Segmentation fault (core dumped)

但是,如果文件事先已经存在(例如,当我手动创建该文件或第二次运行该程序时),它不会分段错误。

请帮帮忙。我需要这个,我们的最后一个项目,一个星期后,我还没有掌握的文件和指针的诀窍。

我用的是"gcc (Ubuntu/Linaro 4.8.1-10 ubuntu9) 4.8.1“

P.s

我在另一个问题上看到了这个

在您的原始代码中,不能保证fopen实际工作,在这种情况下,它将返回NULL,而fclose将不会被定义为行为。

那么我该如何检查它是否有效呢?

EN

回答 5

Stack Overflow用户

发布于 2014-03-19 12:58:52

这是正常的,当您调用fclose(fp1)时,fp1是空的。

顺便说一句

代码语言:javascript
复制
fopen("users.sav","w");

没有用,因为没有将返回值分配给文件指针。这意味着users.sav文件将被打开用于写入,但您将永远无法在其中写入任何内容。

票数 8
EN

Stack Overflow用户

发布于 2014-03-19 12:58:39

fopen返回一个FILE指针。它将返回NULL并设置全局errno以指示错误。如果要检查errno,则必须在检查fopen是否返回NULL之后检查。

代码语言:javascript
复制
if (fp1 == NULL)
{
    printf("fopen failed, errno = %d\n", errno);
}

否则,您可能会从其他地方获得一个errno,而不一定是您的fopen调用。还包括errno.h。您也不需要再次调用fopen("users.sav","w");。您不会重新分配指针,也不会再次检查它。

我看不出有什么理由在这里调用fclose,因为如果fopen返回NULL,就没有什么可关闭的。这可能就是你的缺点的原因。您正在尝试关闭空指针。More information on fopen failures

关于您的代码的另一个评论。如果您要从int返回一个CheckFile,那么它可能不会是失败时的0。我将返回-1以指示错误。更好的是,您可以返回全局errno。另外,main应该是int main(),而在最后您应该是return 0;。我并不特别关心你的CheckFile命名方案。在C语言中,check_file或camelCase of checkFile更好。

CheckFile中,如果您在多行上格式化了一行if语句,则可以对其进行格式化并更好地工作。它不像你现在想的那样:

代码语言:javascript
复制
if(checkfile!=0)
{
   printf("\nERROR ACCESSING FILE!\nNow exiting program with exit code: %d\n", checkfile);
   exit(1);
}

而且,代码中的任何地方都不会设置checkfile。除了零。因此,if语句中的代码不会执行,句号。

票数 4
EN

Stack Overflow用户

发布于 2014-03-19 13:03:11

我不太清楚你想做什么,但眼前的问题是:

代码语言:javascript
复制
if(fp1==NULL)
   fclose(fp1);

断言fp1为NULL后,您将尝试对null指针调用close,这将导致分段错误。

如果您只想验证该文件是否存在,请尝试类似于What's the best way to check if a file exists in C? (cross platform)的操作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22506455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档