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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:50:33