我正在尝试从文件中获取数据并将其存储在我创建的对象中。我一直遇到分段错误,但我不确定是什么原因造成的。这是代码:
Object<string> populateObj(Object<string>&,string);
string clean(string);
int main(){
string dictionaryFile;
ifstream inFile;
ofstream outFile;
Object<string> obj1;
cout << "Enter the name of the Dictionary file" << endl;
cin >> dictionaryFile;
obj1 = populateObj(obj1,dictionaryFile);
}
Object<string> populateObj(Object<string> &obj,string fileName){
ifstream file;
string words = "";
file.open(fileName);
if(file.is_open()){
while(!file.eof()){
file >> words;
obj.add(words);
}
}
else
cout << "could not open file..." << endl;
return obj;
}
这可能会导致也可能不会导致您的问题,但这是错误的:
if(file.is_open()){
while(!file.eof()){
file >> words;
obj.add(words);
}
}
请尝试:
while (file >> words) {
obj.add(words);
}
您的原始代码测试 EOF 太早而没有用处。
int main(){
//...
Object<string> obj1;
//...
obj1 = populateObj(obj1,dictionaryFile);
}
Object<string> populateObj(Object<string> &obj,string fileName){
//...
obj.add(words);
//...
return obj;
}
您不必要地覆盖了对象。别这样。虽然从技术上讲它可以工作,但这是一个坏习惯(它指出你的复制操作员有一个错误)。
相反,返回一个引用(如果有的话)并且不要覆盖该对象。另外,不要按值传入字典字符串,而是通过常量引用传递它:
int main(){
//...
Object<string> obj1;
//...
populateObj(obj1,dictionaryFile);
}
Object<string>& populateObj(Object<string> &obj,const string& fileName){
//...
obj.add(words);
//...
return obj;
}
我希望问题出在您的 Object 类中。如果您保留现有代码,并像这样定义对象,那么它将运行而不会出错:
template<class T> class Object {
public:
void add(T);
};
template <class T> void Object<T>::add(T val)
{
cout << "Adding " << val << "n";
}
因此,您需要查看 Object 类以了解它失败的原因。 最有可能的位置是复制对象以返回它,然后复制回原始 obj1。 该类是分配内存,还是使用不可复制构造的成员变量?
如果您删除不必要的对象返回,则可以通过避免复制来"修复"问题,但您可能仍然希望无论如何修复对象,否则当对象被复制时,此问题可能只会在其他地方出现。