You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 22:35:57