打开文件时C分段错误

时间:2014-12-16 03:12:19

标签: c io segmentation-fault

这似乎是一个非常简单的问题,但在四年内没有触及C编程之后,我无法弄明白。

我试图在main()

中打开一个文件
int main(int argc, const char * argv[])
{
    FILE * fp = fopen("data.txt","r");
    ...
    return(0)
}

程序已编译,但当我尝试在gdb中运行时,会发生以下错误。

Program received signal SIGSEGV, Segmentation fault.
0x00000000004016c6 in main ()

程序试图打开文件" data.txt"。什么可能导致错误?谢谢!

2 个答案:

答案 0 :(得分:2)

我怀疑你的错误在于这个位代码:

...

换句话说,显示的其他代码中没有任何内容似乎是错误的。

可能的情况是该文件不存在,或者它不存在于运行程序的目录中(如果你是这样的话)在IDE中,通常证明是其他的某个地方,而不是你想象的那样。)

并且,在这种情况下,您从NULL获得fopen,然后使用获取,例如:

FILE *fp = fopen ("no_such_file.txt", "r");
int ch = fgetc (fp);

您通常应该检查从使用它们的所有函数返回值来表示成功或失败:

#include <stdio.h>

int main (void) {
    FILE *fp = fopen ("no_such_file.txt", "r");
    if (fp == NULL) {
        perror ("Opening no_such_file.txt");
        return 1;
    }

    // You can use fp here.

    puts ("It worked.");
    fclose (fp);

    return 0;
}

答案 1 :(得分:1)

  

什么可能导致错误?

错误的最可能原因是文件data.txt无法打开(例如因为它不存在,或者它不在当前目录中,或者您的程序没有打开#39 ; t有权阅读它)。这将导致fopen()返回NULL。然后,如果您的代码(在...部分中)尝试调用fread()或fgets()或其他任何内容并传入NULL指针,则会导致崩溃。您需要检查fopen()返回的值,以确保在尝试使用它之前它是非NULL的。