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

C++读取多行格式化文件存入struct 仅获取第一条数据问题排查

问题产生原因

核心问题出在两种输入读取方式的换行符处理逻辑差异上:

  • 使用>>读取price数值时,运算符只会读取数字字符,会把数值末尾的换行符残留在文件输入流的缓冲区中
  • 下一轮循环执行getline时,会直接读取到缓冲区中残留的换行符,得到空字符串作为下一个菜品的描述,后续再用>>读取价格时会匹配到实际的菜名字符串,类型不匹配导致输入流进入错误状态,后续所有读取操作都会直接失败

额外存在逻辑隐患:eof()是在读取操作失败触发文件末尾标记后才会返回真,提前判断!inFile.eof()不能保证后续读取操作一定成功,容易读取到无效数据。

修复方案
  1. 每次读取完价格后,主动清空输入流缓冲区中残留的换行符及后续空白字符
  2. 调整循环判断逻辑,直接以读取操作的返回值作为是否继续执行的判断依据,避免提前判断eof的问题
  3. 补充文件打开的路径参数(当前代码中inFile.open()没有传入目标文件路径,属于遗漏逻辑)

修复后的参考代码:

#include <limits> // 需包含该头文件使用numeric_limits

void getData(MenuItem menuList[], int &size)
{
    // 替换为实际的菜单文件路径
    inFile.open("menu.txt");
    size = 0; // 初始化size避免脏数据
    for(int i = 0; i < 8; i++)
    {
        // 直接判断读取是否成功,失败则终止循环
        if(!getline(inFile, menuList[i].description)) break;
        if(!(inFile >> menuList[i].price)) break;
        menuList[i].quantity = 0;
        size++;
        // 忽略当前行剩余所有字符直到换行,清空缓冲区残留的换行符
        inFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
    // 读取完成后关闭文件
    inFile.close();
}

内容的提问来源于stack exchange,提问作者Noah Valentine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:27:08