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ファイルから 1 つの項目を読み取るコードから始めます。

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 に答える