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

2 回答 2

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 的混乱测试等,只是从一对迭代器初始化的向量。

于 2012-12-02T22:03:07.700 回答
1

您可以将 while 循环更改为

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

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

    ws(initData);

或定义一个operator>>(istream&, SInventory &)并做

SInventory item;
while(initData >> item){
    inven.push_back(item);
}
于 2012-12-02T21:59:58.620 回答