Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.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++ c+;中带有字符*的fopen get错误+;_C++_C_Char - Fatal编程技术网

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
doing
fopen(“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点是
,序列在另一个位置