OOP课程项目:如何从文件拆分字符串并传入库存管理器类的向量
问题描述
我正在完成大学面向对象编程(OOP)小组项目,目标是实现一款收银机系统,目前负责编写库存管理器模块。该模块需要读取data.txt文件内容,将每行数据拆分为三部分:
- 第一部分(数量)存入int类型向量
amount - 第二部分(价格)存入double类型向量
price - 第三部分(商品名称,可能含1-3个单词)存入string类型向量
name
数据文件示例内容:
20 1.99 Potato Chips 10 5.99 Ibuprofen 4 1.42 Candy 55 3.10 Coffee 12 3.25 Hummus 12 4.55 Guacamole 7 0.80 Baklava 45 1.50 Chocolate Chip Cookies
当前类定义与fillInventory方法:
class inventoryManager { private: double total, change, choice; vector <int> amount; vector <string> name; vector <double> price; vector <string> itemList; public: void fileOpen(fstream& inFile); void fillInventory(fstream& inFile); void printInventory(fstream& inFile); };
void inventoryManager::fillInventory(fstream& inFile) { string temp; string a, b; while (!inFile.eof()) { inFile >> a >> b; amount.push_back(stoi(a)); price.push_back(stod(b)); getline(inFile, temp); name.push_back(temp); itemList.push_back(temp); } }
此前尝试用find()按索引拆分,逻辑混乱无法适配;修改文件格式也因商品名含多空格失败。当前方法可运行,但担心正确性与效率,希望得到最优实现方案。
最优实现方案
1. 先修复当前代码的隐患
你当前代码存在两个问题:
while (!inFile.eof())会触发最后一行重复读取(eof()仅在读取失败后才会置位)getline读取的商品名开头会带一个空格(>>操作会跳过空格,后续getline从剩余空白处开始读)
2. 优化后的可靠实现
推荐用getline先读取整行,再通过istringstream拆分内容,完美适配商品名的多单词场景:
#include <sstream> // 需包含此头文件 void inventoryManager::fillInventory(fstream& inFile) { string line; // 逐行读取,直到文件结束 while (getline(inFile, line)) { istringstream lineStream(line); int itemAmount; double itemPrice; string itemName; // 读取固定位置的数量与价格 lineStream >> itemAmount >> itemPrice; // 跳过数量价格后的所有空白,读取剩余内容作为商品名 getline(lineStream >> ws, itemName); amount.push_back(itemAmount); price.push_back(itemPrice); name.push_back(itemName); itemList.push_back(itemName); } }
3. 方案优势
- 正确性:避免了
eof()的陷阱,>> ws自动跳过空白字符,确保商品名从有效字符开始读取,无论单词数量多少都能正确捕获 - 效率:
istringstream的处理效率完全满足大学项目规模,逻辑清晰易维护 - 兼容性:无需修改现有文件格式,适配所有符合规则的输入
4. 额外优化建议
- 改用自定义结构体存储商品数据,更符合OOP封装思想,数据关联性更强:
struct Item { int amount; string name; double price; }; vector<Item> inventory; - 可添加错误检查,比如判断
lineStream >> itemAmount >> itemPrice是否成功,避免文件格式错误导致程序崩溃
内容的提问来源于stack exchange,提问作者Yeonari
相关产品推荐
相关产品推荐

