【问题标题】:Reading from a file in C++ picks up junk从 C++ 中读取文件会产生垃圾
【发布时间】:2014-08-30 22:15:33
【问题描述】:

我正在尝试从文件中读取字符串,但不知道为什么会出现垃圾。这是我的代码:

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

截图如下:

【问题讨论】:

  • 您的输入是什么,您的代码会生成什么结果,您期望什么结果?只是扔掉代码并说它对其他东西不起作用不会让你走得太远。帮助我们帮助您。
  • 为什么要以二进制模式打开?在输入模式下打开它。
  • ifstream 已经是输入模式。我用二进制打开它,因为“写入”的数据就是这种格式。
  • bname 从未设置为任何值。
  • 您的类包含一个从未初始化的原始指针,即使您将类转储到文件中也不会保存bname 指向的内容。这个问题被标记为 C++,所以我建议你使用 std::string 和真正的序列化而不是你现在拥有的代码。

标签: c++ file-io io


【解决方案1】:

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

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

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

直接使用bname,而不是读/写this。此外,您需要初始化bname,否则它将指向垃圾数据。另请注意,如果您尝试将bname 指针直接复制到文件中,它将不起作用。您将需要循环遍历 bname 数据,直到到达末尾才能写入它,同样地读取它。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    相关资源
    最近更新 更多