C++ fprintf iofputs.c上的分段错误:没有这样的文件或目录
我有以下代码:C++ fprintf iofputs.c上的分段错误:没有这样的文件或目录,c++,gdb,C++,Gdb,我有以下代码: FILE* fp; if(value.empty()) return ID; fp=fopen((tmpDir+"/"+filename).c_str(),"a"); string sID=""; if(ID>-1){ sID=to_string(ID)+"\t"; } string row=sID+drawingID+"\t"+data+"\n"; fprintf(fp,"%s",ro
FILE* fp;
if(value.empty())
return ID;
fp=fopen((tmpDir+"/"+filename).c_str(),"a");
string sID="";
if(ID>-1){
sID=to_string(ID)+"\t";
}
string row=sID+drawingID+"\t"+data+"\n";
fprintf(fp,"%s",row.c_str());
fclose(fp);
在GDB下,代码失败,出现以下错误:
Program received signal SIGSEGV, Segmentation fault.
__GI__IO_fputs (str=0x4a864 "1000001\t0\t70\t1\n", fp=0x0) at iofputs.c:38
38 iofputs.c: No such file or directory.
您没有检查
fopen
的结果
根据错误消息fp
为0,表示fopen
失败
我猜,tmpDir不存在或不可访问,或者文件还不存在 您没有检查
fopen
的结果
根据错误消息fp
为0,表示fopen
失败
我猜,tmpDir不存在或不可访问,或者文件还不存在
fp=fopen((tmpDir+“/”+文件名).c_str(),“a”)代码>这不是C。在调用fopen
后,您的代码无法检查fp
是否为NULL
<如果文件无法打开,code>fopen
返回NULL
。value.empty()
<代码>字符串?你确定你使用的语言叫做C吗?使用调试器捕捉崩溃,并在代码中找到它发生的位置。然后检查所有相关变量的值,查看它们的值,并确保它们正常。您向我们展示的输出中有一个很大的提示,上面写着fp=0x0
。这意味着文件是空指针。@FilipKočica:c_str()
。它是C++。它只是标记错误,文件扩展名也有误导性。fp=fopen((tmpDir+“/”+filename).c_str(),“a”)代码>这不是C。在调用fopen
后,您的代码无法检查fp
是否为NULL
<如果文件无法打开,code>fopen
返回NULL
。value.empty()
<代码>字符串?你确定你使用的语言叫做C吗?使用调试器捕捉崩溃,并在代码中找到它发生的位置。然后检查所有相关变量的值,查看它们的值,并确保它们正常。您向我们展示的输出中有一个很大的提示,上面写着fp=0x0
。这意味着文件是空指针。@FilipKočica:c_str()
。它是C++。它只是被错误地标记了,而且文件扩展名也有误导性。我认为这有更基本的错误,比如试图使用“+”操作符连接字符串。虽然你说的是真的,但这并不是事情发生的原因。@DavidHoelzer将字符串与+
连接起来,如果tmpDir
和filename
的类型是std::string
,就可以了。使用<代码> CyScript()/Cux>表明代码实际上是C++。我是在依赖问题中的“C”标签。谢谢!是的,GDB显示filename参数不正确,这意味着文件指针为0。再次感谢,找到了!tmpDir目录是用0777权限创建的,但由于某些原因,它现在有0755权限。谢谢你的帮助。我认为这有更基本的错误,比如试图用“+”操作符连接字符串。虽然你说的是真的,但这并不是事情发生的原因。@DavidHoelzer将字符串与+
连接起来,如果tmpDir
和filename
的类型是std::string
,就可以了。使用<代码> CyScript()/Cux>表明代码实际上是C++。我是在依赖问题中的“C”标签。谢谢!是的,GDB显示filename参数不正确,这意味着文件指针为0。再次感谢,找到了!tmpDir目录是用0777权限创建的,但由于某些原因,它现在有0755权限。谢谢你的帮助。