我目前正在尝试编写一个可以将文件中的对象读入数组的程序。在程序结束时,我希望它将数组的内容写出到文件中。到目前为止,我已经获得了一定程度的成功,我从文件方法中读取似乎没有任何问题,并且在某种程度上我知道我接近我的写入文件方法。它工作,但它也输出由默认构造函数创建的数组的新元素。有什么方法可以阻止这些默认对象被写入文件或者更好,但是首先要阻止它们被制作出来吗?
以下是我的成员变量,默认构造函数和类中的方法
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;
}
答案 0 :(得分: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
以防止重新分配,使用{{3} })。
答案 1 :(得分:1)
首先,如果您operator >>
和operator <<
以及istream
和ostream
而不是函数overload会更好。{{1 }和writeToFile()
。
其次,您可以使用readFromFile()
而不是数组std::vector<Stock>
,并且您的读写循环将更加简单,只涉及从文件中读取一行的Stock items[N];
循环,并且可能while
从该行提取数据成员(stringstream
,stockCode
等)。此外,不再需要stockDesc
变量static
,因为您将向量N
作为元素数量的指示符。
您可以先查看std::vector和streams,了解如何实施上述建议的代码,并补充一些其他研究。