混合
getline
和
>>
因为你需要小心换行,所以经常会出错。
使用
seekg
在文本文件上也打开了一个巨大的蠕虫罐头,看起来你只是偶然发现了它。
getline公司
并使用
std::istringstream
在包含多个项目的行上:
getline(file, n);
getline(file, v);
std::string kqpline;
getline(file, kqpline);
std::istringstream kqpstream(kqpline);
kqpstream >> k >> q >> p;
pshop.setItem(k, n, v, q, p);
你应该把它抽象成一个函数。
这应该按原样工作:
ItemClass readItem(std::istream& in)
{
std::string name;
std::string version;
std::getline(in, name);
std::getline(in, version);
std::string line;
std::getline(in, line);
std::istringstream data(line);
// Just guessing on the types here.
// Adjust according to reality.
unsigned int key = 0;
unsigned int quantity = 0;
float price = 0;
data >> key >> quantity >> price;
ItemClass result;
result.setItem(key, name, version, quantity, price);
return result;
}
int main()
{
//declare a vector to hold the objects for later sorting and placing into a tree structure
vector<ItemClass> classVector;
ifstream file("software.txt");
if (file.fail()) {
cout << "Error reading from file." << endl;
return -1;
}
ItemClass pshop = readItem(file);
ItemClass nU = readItem(file);
ItemClass sW = readItem(file);
ItemClass vsP = readItem(file);
cout << "here is the object we extracted from 'file': " << endl;
pshop.printItem();
nU.printItem();
sW.printItem();
vsP.printItem();
classVector.push_back(pshop);
classVector.push_back(nortonU);
classVector.push_back(vsPro);
classVector.push_back(nSysWorks);
}
(这段代码中没有错误处理,因为这会让人分心。真正的代码应该处理错误。)