读取包含2 diff对象的数据文件。类

时间:2013-11-27 07:37:32

标签: c++

我正在编写一个程序来管理书店的库存细节。它出售书籍和录音带版本。我定义的类是:

class stock

{
char title[30],author[15];
float price; int stockpos;
char version[5];

protected:

void getdata(); void putdata();
void defvers(char a[])  {strcpy(version,a);}//used to identify book & tape
void rettitle(char a[]) {strcpy(a,title);}
void retauthor(char a[]){strcpy(a,author);}
void retvers(char a[])  {strcpy(a,version);}/* all these used to obtain title, 
author, and whether its a book/tape to compare with the given details while searching*/

};

在这里,我为公共数据成员和函数定义了一个类库,并派生了两个类book和tape来定义唯一数据成员。

class book:public stock

{
int pagecount;

public:
book()   {  pagecount=0; defvers("book");    } //ctor
void getdata();
void putdata();

};

class tape:public stock

{
float duration; char readby[15];
public:
tape()    {  duration=0.00; defvers("tape");  }//ctor
void getdata();
void putdata();

};

我正在使用单个数据文件stock.dat并将书籍和磁带的详细信息存储到其中。

现在,让我难过的是如何定义库存中的类功能,根据用户的选择,从单个数据文件stock.dat显示书籍或磁带的所有详细信息。看到book和tape类都有不同的大小,我如何操作file.read()? 或者我走错路,应该创建两个单独的数据文件books.dat和tapes.dat,而不是关心它会延长源代码?

请帮帮我。 ~Athira

编辑: 是的我确实有一个字段用于指定它是书还是磁带。它的'版本[5]'在课程库存中定义。对我来说问题的区域是派生类book和tape的对象,我用它来写二进制数据,文件有不同的大小。

文件中的内容有点像:

书(大小为x) 书(大小为x)

胶带(大小为y)

书(大小为x)

胶带(大小为y) 胶带(大小为y)

那么我怎样才能只读取磁带对象并显示它们?

编辑:
感谢Alwin,Pita和Retired Ninja回答我的问题。您的意见对我来说非常有价值。我学到了很多东西,并且对如何创建我的项目有很多想法。我真的很感谢你花时间帮助我并耐心地回答我的问题。再一次,谢谢大家。

3 个答案:

答案 0 :(得分:0)

如果您坚持将数据放在1个文件中,最好在数据中添加一个名为'type'的字段,以识别该对象中存储的数据。

但我肯定会建议将它放在两个不同的文件中,因为它会使许多事情变得更容易,也使代码更好看。

如果这是C ++,你为什么不使用任何返回?

答案 1 :(得分:0)

如果你的书店在你的程序生命周期中只有磁带和书籍,那么一定要轻松自己创建两个文件。如果您预计您的书店将来会销售不同类型的商品,并且他们希望您扩展您的应用程序以考虑到这一点,那么您最好使用版本控制策略。

很大程度上取决于您在应用程序内部组织对象的方式。你是在向量中持有你的对象还是你正在使用数组(事实上你在函数签名中使用char a[]并使用strcpy我得到了一个明显的印象,你是一个C编码器,因此会使用数组) 。您使用多个阵列还是单个阵列?

代替这两个类,显示加载/存储函数的本质可能更有启发性,但基本理论是存储一些标记/标识符,后跟对象。当您再次读取文件时,首先读取标记并创建相应类型的对象,然后可以通过流式传输对象数据来初始化此对象。 另一个解决方案是首先流式传输一种类型的所有对象,然后是下一种类型的所有对象(中间有一个标记)

祝你好运。

[编辑]

您所描述的是低级数据库访问层实现。考虑到这个主题的难度,有很多收入很高的程序员花了数年时间才能做到这一点并且效率很高。

所以要么这是学习练习,要么你走错了路。不要重新发明轮子并使用那里的东西。 鉴于您到目前为止告诉我的内容,我了解该应用程序的数据库很小并且在低负载条件下运行。您还表示您希望将数据存储在一个文件中。

我建议您研究SQLite,一个免费的数据库访问层系统。您可以使用源代码完整地学习并将其合并到您的程序中。

祝你好运

答案 2 :(得分:0)

好的,我们从头开始吧。由于这是一个学校项目,记录的数量将非常小。所以你可以做的是将完整的文件读入内存。现在你所做的就是在你的库存类中有一个变量,表示它是书还是磁带。

定义指向第一条记录的股票指针并检查类型变量。您现在可以定义书指针或指向同一内存位置的磁带指针。

通过将股票指针向前移动派生类的大小,您将找到下一条记录。

这非常粗糙,永远不会出现在现实世界的应用程序中,但它可能适用于您的学校项目。

顺便说一下,你似乎在编写C代码并尝试将其融入C ++夹克中。也许你会更习惯使用结构在C语言中编写应用程序。这可能会让你更熟悉/更明显。

祝你好运。