这似乎是一个非常简单的问题,但在四年内没有触及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"。什么可能导致错误?谢谢!
答案 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的。