C++ 长字符串类型未正确保存

C++ 长字符串类型未正确保存,c++,string,iostream,C++,String,Iostream,我正在编写一个程序,将电子邮件地址保存在.dat文件中。我声明该电子邮件为字符串电子邮件;并使用将电子邮件保存在.dat文件中 ofstream my_file; my_file.open("Email.dat", ios::in | ios::out | ios::app | ios::binary); while (!my_file.eof()) { p11.Email = Email; break; } my_file.write((char*)&am

我正在编写一个程序,将电子邮件地址保存在.dat文件中。我声明该电子邮件为字符串电子邮件;并使用将电子邮件保存在.dat文件中

ofstream my_file;
my_file.open("Email.dat", ios::in | ios::out | ios::app | ios::binary);
while (!my_file.eof())
{
    p11.Email = Email;
    break;
}

my_file.write((char*)&p11, sizeof(p11));
cout << endl << endl << p11.Email << endl; // just to see if its saving the email properly
my_file.close();
这里p11是一个包含Email变量的类

我的问题是,每当我保存一个长字符串时,p11电子邮件都会正确地存储电子邮件,但是当我再次使用文件处理从.dat文件中找到电子邮件时,我注意到对于一个长电子邮件地址,它会打印很多条作为输出。我还将添加一个屏幕截图

不能执行char*&p11操作。电子邮件在内部隐藏指向字符串内存的指针

你应该做一些类似的事情:

ofstream my_file;

// ... write other parts of p11

// write the email length
int l = p11.Email.length();
my_file.write(&l, sizeof(l));

// write the email content
my_file.write(p11.Email.c_str(), l);
您还需要重写读取,首先读取长度,调整字符串大小,然后读取字符串


但是序列化本身就是一个完整的主题。特别是如果你想在开始的时候用二进制来做。关于结构的填充和打包,以及您是想在同一台机器上读回还是在另一台机器上读回,都需要考虑。

什么是p11?char*&p11可能是错误的。p11是一个包含字符串电子邮件的类。因此,您无法将类型转换为char*。似乎读取函数有问题。我不知道,但我注意到,如果电子邮件字符串超过15个字符,就会出现错误。否则,它可以正常工作……让我换一句话:你不能做char*&p11。电子邮件在内部隐藏指向字符串内存的指针。对于长度为16'15 char+'\0'或更小的字符串,它与您的实现一起工作的原因是因为小字符串优化