C++读取双文本文件匹配商品编码获取对应价格问题
解决Item Code匹配获取Price的问题
我来帮你捋捋这个问题哈!你现在的核心需求是把库存文件里的商品信息存起来,然后和采购文件里的编码匹配,取出对应的单价对吧?之前没成功大概率是几个小细节没处理好,我给你一步步拆解:
第一步:用结构体规范商品数据存储
首先得把库存里的每个商品信息用一个清晰的结构打包,避免数组里的字段混乱。咱们定义一个结构体:
#include <iostream> #include <fstream> #include <vector> #include <string> #include <unordered_map> // 如果想用高效查找的话 using namespace std; struct Item { string code; // 商品编码 double price; // 单价 int quantity; // 库存数量 string name; // 商品名称 };
第二步:正确读取库存文件到数组(或容器)
别用while (!file.eof())这种写法!它经常会导致多读一次或者读取失败,直接用输入操作的结果判断循环结束才靠谱。这里用vector比固定长度数组更灵活:
vector<Item> inventoryItems; ifstream inventoryFile("inventory.txt"); // 替换成你的库存文件名 if (!inventoryFile.is_open()) { cerr << "哎呀,打不开库存文件!检查下路径对不对~" << endl; return 1; } Item tempItem; // 按文件里的顺序读取:编码→单价→数量→名称 while (inventoryFile >> tempItem.code >> tempItem.price >> tempItem.quantity >> tempItem.name) { inventoryItems.push_back(tempItem); } inventoryFile.close();
如果你的库存商品很多,想让匹配速度更快,可以用unordered_map直接存编码和价格的映射,这样查找的时候不用遍历整个数组:
unordered_map<string, double> itemPriceMap; // 读库存时直接存入map while (inventoryFile >> tempItem.code >> tempItem.price >> tempItem.quantity >> tempItem.name) { itemPriceMap[tempItem.code] = tempItem.price; }
第三步:匹配采购文件的编码并获取价格
处理采购文件时,同样要避免eof()的坑,然后每次读到采购编码后,去库存容器里找匹配的项:
ifstream purchasesFile("purchases.txt"); // 替换成你的采购文件名 if (!purchasesFile.is_open()) { cerr << "打不开采购文件!检查路径~" << endl; return 1; } string purchaseItemCode; int purchaseQty, purchaseNum = 1; while (purchasesFile >> purchaseItemCode >> purchaseQty) { double targetPrice = -1; // 用-1标记未找到匹配项 // 方法1:用vector遍历查找 for (const auto& item : inventoryItems) { if (item.code == purchaseItemCode) { targetPrice = item.price; break; } } // 方法2:用unordered_map查找(更高效) // auto it = itemPriceMap.find(purchaseItemCode); // if (it != itemPriceMap.end()) { // targetPrice = it->second; // } // 输出结果 if (targetPrice != -1) { cout << purchaseNum << " " << purchaseItemCode << " " << purchaseQty << " 单价:" << targetPrice << endl; } else { cout << purchaseNum << " " << purchaseItemCode << " 未找到对应商品哦!" << endl; } purchaseNum++; } purchasesFile.close();
几个要注意的小细节
- 确保两个文件里的商品编码格式完全一致:比如大小写、有没有多余空格,不然会匹配失败
- 读取文件时的字段顺序要和文件里的实际顺序对应,比如库存文件里要是先写名称再写编码,那读取顺序也要调整
- 如果用
map的话,记得包含<unordered_map>头文件
内容的提问来源于stack exchange,提问作者user540393




