C++ 从C++;捡垃圾

C++ 从C++;捡垃圾,c++,file-io,io,C++,File Io,Io,我试图从文件中读取字符串,但不知道它为什么会拾取垃圾。这是我的密码: class book { char *bname; public: void addBook() { char newName[30]; cout << "Enter the new bookname: "; cin.getline(newName,30); ofstream add("book.txt",ios::binary | ios::app); if(add.write((

我试图从文件中读取字符串,但不知道它为什么会拾取垃圾。这是我的密码:

class book
{
 char *bname;
 public:
 void addBook()
 {
  char newName[30];
  cout << "Enter the new bookname: ";
  cin.getline(newName,30);

  ofstream add("book.txt",ios::binary | ios::app);

  if(add.write((char*)this,sizeof(this)))
  cout << "Entry Succesful";
  else
  cout << "Entry failed";

 }
 void showBook()
 {
  ifstream getBook("book.txt",ios::binary);

  getBook.seekg(0);

  while(getBook.read((char*)this,sizeof(this)))
  {
   cout << bname;
  }
 }
};
void main()
{
book b;
 b.addBook();
 b.showBook();
 getch();
}
教材
{
char*bname;
公众:
void addBook()
{
char newName[30];
cout您不应该这样做
(char*)这是非常危险的,可能是未定义的行为,它肯定不会做您希望它做的事情。
指针指向整个对象,而不仅仅是一个字段

如果您试图将数据序列化为二进制格式,那么这不是解决问题的方法。目前,您正在写入和读取指针位置。这不起作用,因为指针可以(而且可以)每次程序运行时都指向不同的位置。指针位置本身并不包含任何实际有用的信息

我建议您此时不要尝试序列化数据。请先尝试读/写明文

直接使用
bname
而不是读/写
this
。此外,您需要初始化
bname
,否则它将指向垃圾数据。另外请注意,如果您试图将
bname
指针直接复制到文件中,它将不起作用。您将需要在
bname
数据中循环,直到写到最后,同样地读到最后


你也应该明确地考虑使用<代码> STD::String < /C>,而不是直接操纵<代码> char *//>代码>代码> char 数组。这大大简化了事情,避免了手动内存管理的需要。

你的输入是什么,你的代码生成了什么结果,你期望得到什么结果?t代码和说它不能与其他东西一起工作不会让你走多远。帮助我们帮助你。你为什么要以二进制模式打开?以输入模式打开它。ifstream已经是输入模式。我以二进制打开它,因为“已写入”数据在这个格式中。BNEY从来没有设置为任何值。您的类包含一个原始的指针,它从不初始化,即使是将类卸载到文件中也不会保存<代码> BNEX/COD>指向的。问题是标记C++,所以我建议您使用<代码> STD::String < /C>和真正的序列化,而不是现在的代码。