正确将std :: string写入二进制文件

Ski*_*per 2 c++ string binary serialization char

我正在尝试从cin获取字符串,而不是将其写入二进制文件。我已经读过写纯字符串是行不通的,所以我尝试将其转换为char *。

下面的代码将它写成ok(...大概),但是只有前8个字符,因此文件中的输出是不完整的。

std::string nick, ip, port;

std::cout << "IP: ";
std::cin >> ip;
std::cout << "port: ";
std::cin >> port;

ofstream file1("lastServers.bin", ios::out | ios::binary);
if (file1.good())
{
    const char* p_IP = ip.c_str();
    const char* p_PORT = port.c_str();
    int length = sizeof(&p_IP)+sizeof(&p_PORT);
    char* tmp1 = new char[length];

    int index = 0;
    memcpy((tmp1 + index), p_IP, sizeof(&p_IP));
    index = index + sizeof(&p_IP);
    memcpy((tmp1 + index), p_PORT, sizeof(&p_PORT));

    file1.write(tmp1, length);

    file1.close();
    delete[] tmp1;
}

else
{
    std::cout << "file error write" << endl;
}
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助:)

Ste*_*idd 5

您的代码可以写成

ofstream file1("lastServers.bin", ios::out | ios::binary);
if (file1.good()) {
    file1.write(ip.c_str(), ip.size());
    file1.write(port.c_str(), port.size());
    file1.close();
}
else {
    std::cout << "file error write" << endl;
}
Run Code Online (Sandbox Code Playgroud)

string :: c_str()返回指向字符串文本的const指针。string :: size()返回字符串中的字符数。

在写入文件之前,您不需要连接数据,写一个然后另一个具有相同的结果。

如果要编写C类型代码而不是C ++,则可以使用strlen(p_IP)来获取IP字符串的长度,而不是使用sizeof。

sizeof运算符为您提供类实例的大小,即对象的大小,但字符串对象的大小永远不会受到其管理的字符串大小的影响。

在C ++中,管理某些对象(例如,字符串管理字符,容器管理其内容等)的对象通常具有确定其所管理内容大小的方法。对于std :: string和其他STL容器,该方法为size()。

请注意,以这种格式编写这些字符串意味着您无法分辨一个字符串在哪里结束而另一个在哪里开始。要考虑的两个选项是使用一个您不会在任何字符串中出现的终止字符,或者将字符串的长度写到文件中字符串本身的文本之前。我不会在这里详细说明,因为原始问题中并未询问。