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权限。谢谢你的帮助。