【问题标题】:Long string type not saving properly长字符串类型未正确保存
【发布时间】:2021-04-24 12:40:11
【问题描述】:

我正在编写一个程序来将电子邮件地址保存在 .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 文件中找到电子邮件时,我注意到对于一个长电子邮件地址,它会打印一个很多条作为输出。我还要加一张截图。

【问题讨论】:

  • 什么是p11(char*)&amp;p11 可能是错误的。
  • p11 是一个包含字符串 Email 的类。
  • 那你就不能typecast到char*
  • 读取功能好像有问题。我不知道,但我注意到如果电子邮件字符串超过 15 个字符,则会出现错误。否则,它工作正常......
  • 让我换个说法:你不能这样做(char*)&amp;p11p11.Email 在内部隐藏了一个指向字符串内存的指针。它适用于长度为 16 '15 char + '\0' 或更少的字符串的实现的原因是因为小字符串优化

标签: c++ string iostream


【解决方案1】:

你不能做(char*)&amp;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);

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

但是序列化本身就是一个完整的话题。特别是如果您想在开始时进行二进制处理。关于结构的填充和打包以及您是想在同一台机器上还是在不同的机器上读取它,需要考虑一些因素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 2019-03-14
    • 2014-12-12
    • 2010-09-22
    • 2013-12-04
    • 2011-07-13
    相关资源
    最近更新 更多