【发布时间】:2013-11-27 07:37:32
【问题描述】:
我正在编写一个程序来管理书店的库存详细信息。它出售书籍及其录音带版本。我定义的类是:
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*/
};
在这里,我为通用数据成员和函数定义了一个类库,并派生了 2 个类 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 类函数,该函数将根据用户的选择从单个数据文件 stock.dat 中显示书籍或磁带的所有详细信息。鉴于书籍和磁带类都有不同的大小,我该如何操作 file.read()? 还是我走错了路,应该只创建 2 个单独的数据文件 books.dat 和 tapes.dat,而不在乎它会延长源代码?
请帮帮我。 〜阿西拉
编辑: 是的,我确实有一个字段来指定它是一本书还是一盘磁带。它在类股票中定义的“版本[5]”。对我来说,问题是派生类 book 和 tape 的对象,我用来写入二进制数据的文件具有不同的大小。
文件中的内容有点像:
书(大小 x) 书(x 号)
磁带(大小为 y)
书(x号)
胶带(大小为 y) 胶带(y号)
那我怎样才能只读取磁带对象并显示它们呢?
编辑:
感谢 Alwin、Pita 和 Retired Ninja 回答我的问题。您的意见对我来说非常有价值。我学到了很多东西,并且对如何创建我的项目有了很多想法。我真的很感谢你花时间帮助我并耐心地回答我的问题。再次感谢大家。
【问题讨论】:
-
您的文件是文本格式还是二进制格式?无论哪种方式,您都可以保存接下来要读取的对象类型,然后适当地处理它。
-
问题已更新。请检查一下。
-
好吧,我不知道你的文件是什么样子的,但希望你先写类型,这样就可以在不读取任何内容的情况下对其进行检查。如果您只想阅读磁带,您很可能需要阅读所有内容并丢弃您不想要的部分。如果每种类型的记录都是固定大小的,您也可以在确定它是您不需要的东西后尝试寻找它们,但仅仅阅读它可能会同样快,甚至更快。
-
但问题是 book 类只包含一个额外的数据成员(int 类型),而 tape 类有 2 个 diff 数据成员(1 个 float 和 string 成员)。所以这两种对象都有差异。尺寸。如果我尝试使用 file.read((char*)&bookb, size of(bookb)); 读取磁带类的对象这不会引发错误吗?
-
如果您将两者存储在同一个文件中,您将需要一种更复杂的序列化方法,而不仅仅是将每个结构保存/加载为 blob。
标签: c++