从文件中读取对象并将其存储到数组中,以及将数组中的对象写入文件

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
最好使用 std::vector<Stock> items; 并使用 push_back() 来填充它,而不是使用 Stock items[N]; - πάντα ῥεῖ
2个回答

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 << " ";

在读取时,首先读取num_items:

fileIn >> num_items;

那么,不要使用数组,而是使用std::vector来存储和添加元素(你可以预先将其大小设置为num_items以防止重新分配内存,使用reserve())。


1
首先,最好是你重载operator >>operator <<,以及istreamostream而不是使用函数:writeToFile()readFromFile()
其次,你可以使用std::vector<Stock>代替数组Stock items[N];,这样你的读写循环会更简单,只需涉及一个while循环从文件中读取一行,可能还需要一个stringstream从该行提取数据成员(stockCodestockDesc等)。此外,static变量N将不再需要,因为你将使用向量size()作为元素数量的指示器。
你可以先查看std::vectorstreams,了解如何实现上述建议的代码,并进行一些额外的研究。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接