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>和真正的序列化,而不是现在的代码。