从C ++文件中读取垃圾

时间:2014-08-30 22:15:34

标签: 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((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();
}

以下是截图: enter image description here

1 个答案:

答案 0 :(得分:0)

你不应该(char*)this。这是非常危险的,可能是未定义的行为,它肯定不会做你期望的。 this指针指向整个对象,而不仅仅指向一个字段。

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

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

不是直接阅读/撰写this,而是直接使用bname。此外,您需要初始化bname,否则它将指向垃圾数据。另请注意,如果您尝试将bname指针直接复制到文件中,它将无法工作。您将需要循环遍历bname数据,直到您到达结束时进行编写并同样进行阅读。

您还应该考虑使用std::string而不是直接操作char*char数组。这大大简化了事情,避免了手动内存管理的需要。