C++读取文本文件,根据itemNo查询并仅显示对应价格
解决方法:修改搜索逻辑并修复输入输出小问题
咱们先聚焦你的核心需求:根据itemNo搜索后只显示对应菜品的价格,同时还要修正代码里一个容易导致数据加载出错的小bug,一步步来调整:
1. 核心修改:让Search函数只输出匹配条目的价格
你现在的Search函数找到匹配项后调用cout << r[i];,这会触发你定义的operator<<重载,但这个重载里只输出了编号、类别和菜品名,完全没涉及价格。咱们直接修改搜索函数的输出逻辑就行:
void Search(std::vector<MenuList>& r) // 搜索指定itemNo的价格 { string targetNo; cout << "请输入要搜索的itemNo: "; cin >> targetNo; bool isFound = false; for(int i = 0; i < r.size(); i++) { // 因为itemNo是唯一编号,用精确匹配==比find更准确 if(r[i].itemNo == targetNo) { cout << "编号" << targetNo << "的菜品价格为:$" << r[i].price << "\n"; isFound = true; // 如果itemNo是唯一的,找到后直接跳出循环,不用继续遍历 break; } } // 增加未找到时的提示,提升用户体验 if(!isFound) { cout << "未找到编号为" << targetNo << "的菜品\n"; } }
2. 修复输入流的隐藏bug
你当前的operator>>读取完price后,输入流里会残留换行符,导致下一次getline读取到空的itemNo,进而加载错误的数据。解决方法是读取完价格后忽略掉换行符:
std::istream& operator>>(std::istream& infile, MenuList& menu) { getline(infile, menu.itemNo, ':'); getline(infile, menu.category, ':'); getline(infile, menu.descript, ':'); infile >> menu.price; // 忽略price后面的换行符,避免影响下一次getline读取 infile.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); return infile; }
注意要在代码开头新增头文件:
#include <limits>
3. 可选优化:调整operator<<(如果需要完整显示菜单)
如果之后你需要完整展示菜单条目,可以修改这个重载把价格加上,现在如果只需要搜索价格的话可以暂时不改,给你参考优化后的版本:
std::ostream& operator<<(std::ostream& os, const MenuList& menu) { // 把参数改成const引用,符合C++编码规范 os << menu.itemNo << ": " << menu.category << " - " << menu.descript << " | 价格:$" << menu.price; return os; }
整合后的完整代码
把所有修改整合后,完整代码如下:
#include <iostream> #include <fstream> #include <string> #include <vector> #include <limits> // 新增头文件,用于处理输入流 using std::string; using std::ofstream; using std::ifstream; using std::cout; using std::cin; struct MenuList { string itemNo; string category; string descript; double price; }; std::istream& operator>>(std::istream& infile, MenuList& menu) { getline(infile, menu.itemNo, ':'); getline(infile, menu.category, ':'); getline(infile, menu.descript, ':'); infile >> menu.price; // 忽略换行符,修复输入bug infile.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); return infile; } std::ostream& operator<<(std::ostream& os, const MenuList& menu) { os << menu.itemNo << ": " << menu.category << " - " << menu.descript << " | 价格:$" << menu.price; return os; } void Load(std::vector<MenuList>& r, string filename) { std::ifstream ifs(filename.c_str()); if(ifs) { MenuList temp; // 用while(ifs >> temp)代替while(ifs.good()),判断更可靠 while(ifs >> temp) { r.push_back(temp); } cout << "成功读取" << r.size() << "条记录。\n\n"; } else { cout << "无法打开文件。\n\n"; } } void Read(std::vector<MenuList>& r) { for(unsigned int i = 0; i < r.size(); i++) cout << r[i] << "\n"; } void Search(std::vector<MenuList>& r) { string targetNo; cout << "请输入要搜索的itemNo: "; cin >> targetNo; bool isFound = false; for(int i = 0; i < r.size(); i++) { if(r[i].itemNo == targetNo) { cout << "编号" << targetNo << "的菜品价格为:$" << r[i].price << "\n"; isFound = true; break; } } if(!isFound) { cout << "未找到编号为" << targetNo << "的菜品\n"; } } int main() { std::vector<MenuList> records; Load(records, "delete.txt"); Read(records); Search(records); return 0; }
现在运行程序,输入对应的itemNo,就会只显示你想要的价格了,同时也解决了数据加载时可能出现的异常问题。
内容的提问来源于stack exchange,提问作者Niku Nik
相关产品推荐
相关产品推荐

