长字符串类型未正确保存

Long string type not saving properly

提问人:Mark Daniel 提问时间:4/24/2021 最后编辑:acraig5075Mark Daniel 更新时间:4/26/2021 访问量:236

问:

我正在编写一个程序来将电子邮件地址保存在 .dat 文件中。我在“string Email”中声明了电子邮件,.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();

(下面是一个具有 Email 变量的类)p11

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

enter image description here

enter image description here

C++ 字符串 IOSTREAM

评论

0赞 Jeffrey 4/24/2021
什么? 很可能是错的。p11(char*)&p11
0赞 Mark Daniel 4/24/2021
p11 是一个包含字符串 Email 的类。
0赞 Jeffrey 4/25/2021
然后你不能打字到char*
0赞 Mark Daniel 4/26/2021
读取功能似乎有问题。我不知道,但我注意到,如果电子邮件字符串超过 15 个字符,它会给出错误。否则,它可以正常工作......
0赞 Jeffrey 4/26/2021
让我改写一下:你不能做. 在内部隐藏指向字符串内存的指针。它适用于长度为 16 '15 char + '\0' 或更小的字符串的实现的原因是小字符串优化(char*)&p11p11.Email

答:

1赞 Jeffrey 4/26/2021 #1

你不能做. 在内部隐藏指向字符串内存的指针。(char*)&p11p11.Email

你应该做这样的事情:

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

您还需要重写读取,首先读取长度,调整字符串大小,然后读取字符串。

但序列化本身就是一个完整的话题。特别是如果你想像你开始时一样做二进制。围绕结构的填充和打包以及是否要在同一台机器上或另一台机器上读回它,有一些考虑因素。