2012-12-02 45 views
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 
... 
+2

首先,不要使用'while(!whatever_file.eof())'。 –

+0

家庭作業標籤已棄用,不應在新問題中使用。 – Kitsune

+0

@JerryCoffin在以下情況下,這是可以接受的用法,爲什麼我不能在我的示例中使用此方法,而應該執行什麼操作。謝謝http://stackoverflow.com/questions/9979894/using-vector-of-user-defined-class-type-objects – Michael

回答

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

您可以將while循環改爲

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

或while循環

ws(initData); 

結束跳過空白或定義operator>>(istream&, SInventory &),只是做

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