c ++ - 正确地将std :: string写入二进制文件

时间:2014-12-17 10:21:06

标签: c++ string serialization binary char

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

以下代码写好(可能),但只有前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;
}

提前感谢您提供任何帮助:)

2 个答案:

答案 0 :(得分:4)

您的代码可以写成

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

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

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

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

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

在C ++中,管理某些东西的对象(认为管理字符的字符串,管理其内容的容器等)通常有一种方法来确定他们管理的内容的大小。对于std :: string和其他方法为size()的STL容器。

请注意,以这种格式编写这些字符串意味着您无法判断一个字符串的结束位置和另一个字符串的开始位置。要考虑的两个选项是使用您知道不会出现在任何字符串中的终止字符,或者在字符串本身的文本之前将字符串的长度写入文件。我不会在这里详细说明,因为在原始问题中没有问过。

答案 1 :(得分:2)

sizeof返回内存中字符串对象的大小,而不是字符串本身的长度。具体来说,sizeof(&p_IP)返回指向p_IP的指针的大小,在32位系统上总是4个字节。您的变量length根本无法计算到正确的值。要获得char *的长度,请使用strlen