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

C++数组转vector后文件读取循环无法终止问题求助

解决C++文件读取无限循环问题

嘿,我一眼就看出你踩了C++文件读取里两个超级常见的坑,这才导致循环停不下来!咱们一步步拆解问题,再给你修复方案:

问题根源分析

1. while(!iFile.eof())的致命逻辑错误

很多新手都会用这个判断,但它的逻辑完全反了:eof()只有在尝试读取超出文件末尾时才会被置为true。也就是说,当文件最后一次读取成功后,eof还是false,循环会强行再执行一次——这时候读取操作会失败,但你依然把无效的临时变量塞进vector里,而且流会进入错误状态,后续所有读取都失败,但eof可能没触发(比如是fail状态),导致循环无限跑下去。

2. iFile.ignore()的误用

你用getline(iFile, nTemp)读取名字后,getline已经把换行符从流里丢弃了,这时候调用iFile.ignore()会直接吃掉下一个字符(也就是价格的第一个数字),导致后续的iFile >> pTemp读取失败,流直接进入错误状态。之后的所有读取操作全失败,但循环还在继续,不断往vector里塞垃圾数据,所以你看到size一直在涨。

修复后的代码方案

假设你的文件格式是每行一个名字,下一行价格,再下一行数量,我给你调整了读取逻辑,同时修复了循环判断问题:

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <limits> // 用于numeric_limits

using namespace std;

void readIn(ifstream &iFile, vector<string> &itemName, vector<double> &itemPrice, vector<double> &quantity) {
    string nTemp;
    double pTemp;
    int qTemp;

    // 把读取操作直接放在循环条件里,只要有一个读取失败就终止循环
    while (getline(iFile, nTemp)) { // 先读取名字
        // 读取价格,检查是否成功
        if (!(iFile >> pTemp)) break;
        // 读取数量,检查是否成功
        if (!(iFile >> qTemp)) break;
        
        // 处理数量后面的换行符,避免下一次getline读到空行
        iFile.ignore(numeric_limits<streamsize>::max(), '\n');
        
        // 所有读取都成功,再加入vector
        itemName.push_back(nTemp);
        itemPrice.push_back(pTemp);
        quantity.push_back(qTemp);
        
        cout << itemName.size() << " " << itemPrice.size() << " " << quantity.size() << endl;
    }
}

// 调用部分不用改
// readIn(appIn, appName, appPrice, appquantity);
// readIn(drinkIn, drinkName, drinkPrice, driquantity);
// readIn(entreeIn, entreeName, entreePrice, entquantity);
// readIn(dessertIn, desName, desPrice, dessquantity);

如果你的文件格式是每行包含名字、价格、数量三个字段(比如可乐 3.5 10),那更推荐用逐行读取再解析的方式,避免换行符问题:

#include <sstream> // 用于istringstream

void readIn(ifstream &iFile, vector<string> &itemName, vector<double> &itemPrice, vector<double> &quantity) {
    string line;
    while (getline(iFile, line)) { // 逐行读取
        istringstream lineStream(line);
        string nTemp;
        double pTemp;
        int qTemp;
        
        // 从当前行解析三个字段,成功才加入vector
        if (lineStream >> nTemp >> pTemp >> qTemp) {
            itemName.push_back(nTemp);
            itemPrice.push_back(pTemp);
            quantity.push_back(qTemp);
            
            cout << itemName.size() << " " << itemPrice.size() << " " << quantity.size() << endl;
        }
    }
}

关键总结

  • 永远不要用while(!iFile.eof())来控制文件读取循环,直接把读取操作放在循环条件里判断返回值才是正确姿势。
  • 处理getline和>>混用时,一定要注意换行符的处理,避免流读取混乱。
  • 每次读取后都要检查流的状态,确保读取成功再处理数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:11:03