C 添加文件关闭语句会导致seg错误
在读取文件后试图关闭文件时,我在运行程序时遇到seg故障C 添加文件关闭语句会导致seg错误,c,file-io,segmentation-fault,C,File Io,Segmentation Fault,在读取文件后试图关闭文件时,我在运行程序时遇到seg故障 int inputDirectory() { char fileName[64];char directoryBuffer[256];FILE *fp; printf("\n> Please type the filename containing the list of directories. >"); inputFix(fileName, sizeof(fileName));
int inputDirectory()
{
char fileName[64];char directoryBuffer[256];FILE *fp;
printf("\n> Please type the filename containing the list of directories. >");
inputFix(fileName, sizeof(fileName));
fp = fopen(fileName,"r");
if(access(fileName, F_OK) == 0)
{
if (fp == 0)
{
printf("> Error opening file.");
return 1;
}
else
{
if (access(fileName, R_OK) == 0)
{
while (fgets(directoryBuffer, sizeof(directoryBuffer), (FILE*)fp))
{
readCheck(directoryBuffer);
printf("%s \n", directoryBuffer);
getInode(directoryBuffer);
}
}
else
{
printf("\n> File can't be read.");
}
}
}
else
{
printf("\n> File %s does not exist ", fileName);
}
fclose(fp);
return 0;
}
void inputFix(char string[],int length)
{
int ch, len = 0;
fgets(string, length, stdin);
string[strcspn(string, "\r\n")] = '\0';
len = strlen(string);
if (len == length - 1)
{
while((ch = getchar()) != '\n' && ch != EOF);
}
}
void readCheck(char string[])
{
string[strcspn(string, "\r\n")] = '\0';
}
我一直在阅读比赛情况,但据我所知没有一个?在尝试打开文件之前,是否需要检查文件是否存在?是否需要包括我正在使用的一些检查?如果
fp
为null(等于0),则不需要关闭它,因为文件从一开始就没有打开过。成功读取后,应关闭fp
。查看这些行
if (fp == 0)
{
printf("> Error opening file.");
fclose(fp); // NOT NEEDED. REMOVE THE LINE
}
当您无法打开文件时,似乎不需要调用fclose
删除该行。无论文件是否打开,您都将在结尾处关闭该文件。对未打开的文件调用fclose可能会导致崩溃。试试这个。我已将fclose语句移动为仅在fp不为NULL时调用
int inputDirectory()
{
char fileName[64];char directoryBuffer[256];FILE *fp;
printf("\n> Please type the filename containing the list of directories. >");
inputFix(fileName, sizeof(fileName));
if(access(fileName, F_OK) == 0)
{
fp = fopen(fileName,"r");
if (fp == NULL)
{
printf("> Error opening file.");
return 1;
}
else
{
if (access(fileName, R_OK) == 0)
{
while (fgets(directoryBuffer, sizeof(directoryBuffer), (FILE*)fp))
{
readCheck(directoryBuffer);
printf("%s \n", directoryBuffer);
getInode(directoryBuffer);
}
}
else
{
printf("\n> File can't be read.");
}
fclose(fp);
}
}
else
{
printf("\n> File %s does not exist ", fileName);
}
return 0;
}
仅调用成功调用返回的文件*
要测试fopen()
是否成功,请将其结果与NULL
进行比较。如果此测试成功,则调用未成功:
#include <stdio.h>
int main(void)
{
char filename[] = "myfile";
FILE * fp = fopen(filename, "r");
if (NULL == fp)
{
fprintf(stderr, "fopen(\"%s\", ...) failed.\n", filename);
}
else
{
fprintf(stderr, "fopen(\"%s\", ...) succeeded.\n", filename);
/* Perform operation on fp here. */
fclose(fp);
}
return 0;
}
#包括
内部主(空)
{
char filename[]=“myfile”;
FILE*fp=fopen(文件名,“r”);
if(NULL==fp)
{
fprintf(stderr,“fopen(\%s\,…)失败。\n”,文件名);
}
其他的
{
fprintf(stderr,“fopen(\%s\,…)成功。\n”,文件名);
/*在此处对fp执行操作*/
fclose(fp);
}
返回0;
}
我已将其更改为放在末尾。似乎还是seg故障。什么线路?如果您不知道如何修复segfault,我建议您通过gdb运行它,告诉我它是由fclose(fp)引起的,即使在移动它之后也是如此。即使它没有从文件中读取,在检查之前我已经打开了它。根据gdb,fp
的值是多少?0xb7e852f2,这很奇怪,因为程序从0x80486a0开始。0xb7e852f2将是库参考,对吗?我使用了-ggdb,但gdb没有看到调试符号。“我一直在阅读比赛条件”。。。是什么引导你走上那条路?这是线程进程的一部分,还是在自由线程COM服务器或类似服务器上的某个位置调用的?正在从文件I/O读取可能的seg错误。这没有多大意义。我认为这与此有关。如果文件不存在,它会跳过,然后调用fclose(fp),而不会打开任何文件。因此,当给定的文件名无效时,fp的0x0点。fclose(fp)需要位于while循环之后。因此。。。这让我想知道:(文件*)fp
?那个东西还不是一个文件*
??