class Transaction //TO store a transaction read from file
{
public:
int maxlenth;
int length1,length2;
vector<string> *items;
vector<int> *share;
int tmv;
Transaction():maxlenth(Translen),length1(0),length2(0)
{
items=new vector<string>(maxlenth);
share=new vector<int>(maxlenth);
}
~Transaction()
{
delete items;
delete share;
}
void set_tmv()
{
tmv=0;
for(int i=0;i<=length2;i++)
tmv=tmv+(*share)[i];
}
};
class Data
{
public:
ifstream in;
Data(char *filename);
~Data();
Transaction& getnextTransaction(Transaction &Trans);
};
Data::Data(char *filename)
{
ifstream in(filename);
assure(in,filename);
}
Data::~Data()
{
in.close();
}
Transaction& Data::getnextTransaction(Transaction &Trans)
{
const char* delimiters =
" \t;()\"<>:{}[]+-=&*#.,/\\~";
//ifstream in("testdata.txt");
//set<string>Items1;
vector<string> v(5);
int i=0;
string line;
getline(in, line);
char* s =strtok((char*)line.c_str(), delimiters);
while(s)
{
if(i==v.size())
v.resize(v.size()*2);
v[i++]=s;
s = strtok(0, delimiters);
}
vector<string>::iterator it=v.begin();
int j=0;
while(j<50)
{
(*Trans.items)[(Trans.length1)++]=v[j];
j=j+2;
}
j=1;
while(j<=50)
{
(*Trans.share)[Trans.length2++]=(atoi(v[j].c_str()));
j=j+2;
}
//copy(v.begin(),v.end(),ostream_iterator<string>(cout,"\n");
return Trans;
}
int main()
{
Data d("testdata.txt");
Transaction t,q;
d.getnextTransaction(t);
t.set_tmv();
return 0;
}
雖然我用gdb調試,我在歌廳是這樣的:在的std :: string在這段代碼中產生分段錯誤?
PROGRAMM收到SIGSEGV段錯誤::分配(的std :: string常量&)
雖然我在函數getNexttransaction()
中包含行ifstream in("testdata.txt")
,但我沒有收到任何錯誤。
怎麼回事?
我不認爲這個錯誤來自那裏,但要確保在字符串文字中使用'const char *'類型,就像'Data'的構造函數一樣。 – 2011-05-23 04:39:13
在段錯誤後,bt(在gdb中)打印什麼? – 2011-05-23 04:44:30
你*真的*想爲這個類定義一個拷貝構造函數和賦值操作符,或者當它們被隱式調用時會導致各種頭痛。 – 2011-05-23 04:44:40