我有一个代码,用于从2D矢量Kvec输出到文件。文件的名称输入到字符串s中,我使用sprintf将int转换为要输入到字符串中的char。然后我用了 s.c_str()将其输入为我要打开的文件的名称。因此,当我尝试运行代码时,当我尝试使用foo.open()打开文件时,我会遇到段错误。这个错误的范围很小,我很困惑,错误在哪里。
我已经使用这种技术处理字符串以打开文件,所以我知道sprintf和s.push_back()工作。我哪里错了?
fstream foo;
string s;
char g[10],j[10];
int b=0;
sprintf(j,"L_%dLprime_%dM_%dMprime_%d",L,Lprime,M,Mprime);
for(int i=0;i<(int)strlen(j);i++)
s.push_back(j[i]);
for( int D = 0; D < 1000; D++ )
{
s+="MSF-Dval";
sprintf(g,"%d",D);
for(int i=0; i<(int)strlen(g); i++)
s.push_back(g[i]);
s+=".dat";
foo.open(s.c_str(), ios::in | ios::out | ios::binary );
cout<<"Is this working?"<<endl;
b = 0;
for(L1=abs(L-D);L1<L1max;L1++)
{
if( (D>abs(L+L1) || D<abs(L-L1)) && b == 0)
{
if(remove(s.c_str())!=0)
cout<<"error deleting file";
break;
}
b = 1;
if(foo.is_open())
{
foo << L1 << " "<<Kvec.at(L1).at(L1+D-abs(L-L1)).re<<" "<<Kvec.at(L1).at(L1+D-abs(L-L1)).im<<endl;
}
else
cout<<"not open";
}
foo.close();
s.erase(8,4 + (int)strlen(g));
}
答案 0 :(得分:2)
你的问题在于这两行。
char g[10],j[10];
sprintf(j,"L_%dLprime_%dM_%dMprime_%d",L,Lprime,M,Mprime);
为j
分配一个10个字符的缓冲区,然后继续向该缓冲区写入20个以上的字符,覆盖它并调用Undefined Behavior。
一旦你进入UB,一个段错误就是许多可能出错的事情之一。