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

时间:2012-12-02 21:52:55

标签: c++ data-structures vector infinite-loop

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
...

2 个答案:

答案 0 :(得分:3)

永远不要使用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进行混乱测试等,只是从一对迭代器初始化的向量。

答案 1 :(得分:1)

您可以将while循环更改为

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

或在while循环结束时跳过空白

    ws(initData);

或定义operator>>(istream&, SInventory &),然后执行

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