我一直在尝试用C语言进行简单的文件处理,我希望确保可以使用以下方法访问该文件
#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;
}然后显示
Segmentation fault (core dumped)但是,如果文件事先已经存在(例如,当我手动创建该文件或第二次运行该程序时),它不会分段错误。
请帮帮忙。我需要这个,我们的最后一个项目,一个星期后,我还没有掌握的文件和指针的诀窍。
我用的是"gcc (Ubuntu/Linaro 4.8.1-10 ubuntu9) 4.8.1“
P.s
我在另一个问题上看到了这个
在您的原始代码中,不能保证fopen实际工作,在这种情况下,它将返回NULL,而fclose将不会被定义为行为。
那么我该如何检查它是否有效呢?
发布于 2014-03-19 12:58:52
这是正常的,当您调用fclose(fp1)时,fp1是空的。
顺便说一句
fopen("users.sav","w");没有用,因为没有将返回值分配给文件指针。这意味着users.sav文件将被打开用于写入,但您将永远无法在其中写入任何内容。
发布于 2014-03-19 12:58:39
fopen返回一个FILE指针。它将返回NULL并设置全局errno以指示错误。如果要检查errno,则必须在检查fopen是否返回NULL之后检查。
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语句,则可以对其进行格式化并更好地工作。它不像你现在想的那样:
if(checkfile!=0)
{
printf("\nERROR ACCESSING FILE!\nNow exiting program with exit code: %d\n", checkfile);
exit(1);
}而且,代码中的任何地方都不会设置checkfile。除了零。因此,if语句中的代码不会执行,句号。
发布于 2014-03-19 13:03:11
我不太清楚你想做什么,但眼前的问题是:
if(fp1==NULL)
fclose(fp1);断言fp1为NULL后,您将尝试对null指针调用close,这将导致分段错误。
如果您只想验证该文件是否存在,请尝试类似于What's the best way to check if a file exists in C? (cross platform)的操作。
https://stackoverflow.com/questions/22506455
复制相似问题