C++ c+;中带有字符*的fopen get错误+;
有一个加载文件的函数:C++ c+;中带有字符*的fopen get错误+;,c++,c,char,C++,C,Char,有一个加载文件的函数: int loadfile(char *fn) { printf( "\n my path: '%s' \n", fn ); FILE *f = fopen( fn, "r"); printf( "got\n" ); ... return 1; } 第一个文件位于main()newfile(argv[1]),工作正常。第二个是通过flex解析/读取第一个文件得到的,我相信这与问题无关 控制台: path: 'file1.hot'
int loadfile(char *fn)
{
printf( "\n my path: '%s' \n", fn );
FILE *f = fopen( fn, "r");
printf( "got\n" );
...
return 1;
}
第一个文件位于main()newfile(argv[1])代码>,工作正常。第二个是通过flex解析/读取第一个文件得到的,我相信这与问题无关
控制台:
path: 'file1.hot'
got
path: 'file2.hot'
Segmentation fault: 11
printf能够打印char*fn,但是fopen出现了分段错误
下一种情况是,我尝试显式地将文件放入loadfile
doingfopen(“file2.hot”,“r”)代码>和工作
<>我用g++编译,用C++来使用char或fOpen-< /p>有不同的接近
编辑
对不起,没有newfile(argv[1])代码>。正确:loadfile(argv[1])代码> > < P>一般注释:使用C++时,请选择<代码> STD::FStuts > C风格>代码> FOpen\ <代码> />代码FRAAD < /代码>等;也更喜欢std::string
而不是char*
。单靠后者就能治愈许多记忆性头痛。如果出于某种原因,您必须坚持使用C风格的函数,请确保检查返回值(如本文其他答案中所述)
fopen
,例如,当失败时返回空指针
针对您的问题:尝试在(例如,gdb
)下运行您的程序,以查看分段错误确切发生的位置;这样,您还可以查看更多详细信息(例如,可变内容等)。或者,如果在Linux下工作,使用分析工具来检测任何类型的内存访问问题。 < P>一般:使用C++时,请选择“代码> STD::FStuts”到C风格>代码> FOpen< <代码> />代码> Frad < /C> >等;也更喜欢std::string
而不是char*
。单靠后者就能治愈许多记忆性头痛。如果出于某种原因,您必须坚持使用C风格的函数,请确保检查返回值(如本文其他答案中所述)
fopen
,例如,当失败时返回空指针
针对您的问题:尝试在(例如,gdb
)下运行您的程序,以查看分段错误确切发生的位置;这样,您还可以查看更多详细信息(例如,可变内容等)。或者,如果在linux下工作,请使用分析工具,例如检测任何类型的内存访问问题。学习使用调试器(假设您在linux上)或实用程序。
也许将您的文件路径放在a中是值得的,并且,正如nyarlathotep提到的,使用a
您的fn
可能不是以null结尾的
使用g++-Wall-g编译
正如Anders K所回答的,始终检查fopen
的结果是否为空。Pierre Vittet对GCC的扩展(以代码形式编写)能够自动检查您是否进行了检查。学习使用调试器(假设您在Linux上)或实用程序。
也许将您的文件路径放在a中是值得的,并且,正如nyarlathotep提到的,使用a
您的fn
可能不是以null结尾的
使用g++-Wall-g编译
正如Anders K所回答的,始终检查fopen
的结果是否为空。Pierre Vittet对GCC的扩展(编码为)能够自动检查您是否确实检查了它。您应该始终检查具有返回值的函数的返回值。在这种情况下,请确保打开文件时返回句柄不为NULL,并确保打开文件时将其丢失。您应该始终检查具有返回值的函数的返回值。在这种情况下,请确保打开文件时返回句柄不为NULL,并且确保打开文件时会将其丢失。对于SEGFULT错误,您可能必须提供完整的程序,而不是单个函数。错误通常不在segfault弹出的位置。在发现问题方面有进展吗?您是否尝试过任何建议的解决方案?对于SEGFULT错误,您可能必须给出完整的程序,而不是单个函数。错误通常不在segfault弹出的位置。在发现问题方面有进展吗?你有没有试过任何建议的解决方案?也许更重要的是:更喜欢std::string
而不是char*
。我敢打赌,他的问题是由于使用char*
时缓冲区溢出造成的。是的,我更喜欢,但这一小部分在gnu flex中。我不知道我是否可以改成fstream和string。“我以前相信printf,然后我选了一个…”。问题在另一个方面,正如大家所说。我现在正确地使用了gdb。我不明白为什么printf没有被打印出来,因为真正的问题离这里很远;就我记忆所及,每次调用printf
后,您都必须调用fflush(stdout)
,以使其立即打印。更重要的是,也许是:更喜欢std::string
而不是char*
。我敢打赌,他的问题是由于使用char*
时缓冲区溢出造成的。是的,我更喜欢,但这一小部分在gnu flex中。我不知道我是否可以改成fstream和string。“我以前相信printf,然后我选了一个…”。问题在另一个方面,正如大家所说。我现在正确地使用了gdb。我不明白为什么printf没有被打印出来,因为真正的问题离这里很远;就我记忆所及,每次调用printf
后,您必须调用fflush(stdout)
,使其立即打印。如果程序在加载文件时出现分段错误,问题可能在其他点,而不是那里?步骤是打印名称>fopen>打印已获取。如果未打印得到的打印,则问题可能存在,也不可能存在于打印之间?我按照你说的编译,0点是
,序列在另一个位置