Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 添加文件关闭语句会导致seg错误_C_File Io_Segmentation Fault - Fatal编程技术网

C 添加文件关闭语句会导致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));

在读取文件后试图关闭文件时,我在运行程序时遇到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));
    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
?那个东西还不是一个
文件*
??