2016-01-17 109 views
3

我目前正在嘗試編寫一個程序,它可以將文件中的對象讀入數組。接近程序結束時,我希望它將數組的內容寫入文件中。到目前爲止,我已經取得了一定程度的成功,我從文件方法閱讀似乎沒有問題,並在一定程度上我知道我接近寫入文件方法。它可以工作,但它也輸出由默認構造函數創建的數組的新元素。有沒有什麼辦法可以阻止這些默認對象被寫入文件或更好的,阻止他們在第一個地方?從文件讀取對象到數組中,反之亦然

這裏是我的成員變量,默認的構造函數和方法在我的課

private: 
    //Member variables 
    string stockCode; 
    string stockDesc; 
    int currentLevel; 
    int reorderLevel; 

//Defining Default Constructor 
Stock::Stock() 
{ 

} 

//Defining function for items to file 
void Stock::writeToFile(ofstream& fileOut) 
{ 
    fileOut << stockCode << " "; 
    fileOut << stockDesc << " "; 
    fileOut << currentLevel << " "; 
    fileOut << reorderLevel << " "; 
} 

//Defining function for reading items in from the file 
void Stock::readFromFile(ifstream& fileIn) 
{ 
     fileIn >> stockCode; 
     fileIn >> stockDesc; 
     fileIn >> currentLevel; 
     fileIn >> reorderLevel; 
} 

這裏是我的主要

#include <iostream> 
#include <string> 
#include <fstream> 
#include "Stock.h" 

using namespace std; 

int main() 
{ 
    const int N = 15; 
    Stock items[N]; 
    int option = 0; 
    ifstream fileIn; 
    fileIn.open("Stock.txt"); 
    for (int i = 0; i < N; ++i) 
     items[i].readFromFile(fileIn); 
    fileIn.close(); 
    cout << "1.Display full stock list." << endl; 
    cout << "9.Quit." << endl; 
    cout << "Please pick an option: "; 
    cin >> option; 
    switch (option) 
    { 
    case 1: 
    { 
     cout << "stockCode" << '\t' << "stockDesc" << '\t' << '\t' << "CurrentLevel" << '\t' << "ReorderLevel" << endl; 
     cout << "------------------------------------------------------------------------------" << endl; 
     for (int i = 0; i < N; ++i) 
     { 
      cout << items[i].getCode() << '\t' << '\t'; 
      cout << items[i].getDescription() << '\t' << '\t' << '\t'; 
      cout << items[i].getCurrentLevel() << '\t' << '\t'; 
      cout << items[i].getReorderLevel() << endl; 
     } 
     break; 
    } 

    case 9: 
     ofstream fileOut; 
     fileOut.open("Stock.txt"); 
     for (int i = 0; i < N; ++i) 
     { 
      items[i].writeToFile(fileOut); 
     } 
     break; 
    } 
    return 0; 
} 
+1

跟蹤您使用其他變量的元素數量。 – molbdnilo

+1

'Stock items [N];'最好使用'std :: vector items;'並使用'push_back()'來填充它。 –

回答

3

你可以保持存儲在文件中的項目數的軌道,並最終通過將該數字作爲文件中的第一個值存儲在代碼中添加:

int num_items = 0; 
// keep track of number of items in code 
// when writing to the file, first write num_items 
fileOut << num_items << " "; 

閱讀時,首先閱讀項數:

fileIn >> num_items; 

然後,而不是數組,使用std::vector存儲和添加元素(你可以設置它的大小num_items前面,防止重新分配,使用reserve())。 writeToFile()readFromFile()

1

首先,如果你overloadistreamoperator >>operator <<,一起ostream,而不是它的函數會更好。

其次,你可以使用std::vector<Stock>代替陣列Stock items[N];和你的閱讀和寫作的循環會更簡單,只涉及while循環從文件讀取和可能的stringstream提取數據成員(stockCodestockDesc線,等等)。此外,static變量N將不再需要,因爲您將矢量size()作爲元素數目的指示符。

您可以首先看看std::vectorstreams,以瞭解如何實現上述建議的代碼,並補充一些額外的研究。

相關問題