错误:将元素加载到矢量时无限循环


void initializeVectorFromFile(vector<SInventory> & inven){
        ifstream initData("inventoryData.txt");
    if(!initData){
        cout << "File could not be accessed! Press any key to terminate program...";
        _getch();
        exit(1);
    }
    while(!initData.eof()){
        SInventory item;
        initData >> item.itemID;
        getline(initData,item.itemName);
        initData >> item.pOrdered
                 >> item.menufPrice
                 >> item.sellingPrice;
        item.pInStore = item.pOrdered;
        item.pSold = 0;
        inven.push_back(item);
        cout << item.itemID << endl;
    }
    cout << "File Read Success!" << endl;
    initData.close();
}

我正在读取的.txt文件包含按以下顺序结构化的数据:

int
string
int double double

while-循环最后一行中的输出作为文件中的第一个 itemID 重复。initData流不会读取.txt文件中的后续条目。

1111
1111
1111
1111
1111
...
永远不要

使用while (!initData.eof())。这几乎是一个有保证的错误。

我将从代码开始,从文件中读取单个SInventor项:

std::istream &operator>>(std::istream &initData, SInventor &item) { 
    initData >> item.itemID;
    getline(initData,item.itemName);
    initData >> item.pOrdered
             >> item.menufPrice
             >> item.sellingPrice;
    item.pInStore = item.pOrdered;
    item.pSold = 0;    
    return initData;
}
有了这个,最简单的方法是

不带函数的其余部分,直接初始化向量:

std::ifstream infile("yourfile.txt");
std::vector<SInventor> inven((std::istream_iterator<SInventor>(infile)),
                              std::istream_iterator<SInventor>());
没有

循环,没有 EOF 的混乱测试等,只是一个从一对迭代器初始化的向量。

您可以将while循环更改为

SInventory item;
while(initData >> item.itemID){
    ...

或跳过 while 循环末尾的空格

    ws(initData);

或者定义一个operator>>(istream&, SInventory &)然后只是做

SInventory item;
while(initData >> item){
    inven.push_back(item);
}

最新更新