std::string equivalent for data with null characters?

前端 未结 5 1121
梦谈多话
梦谈多话 2021-01-13 18:57

I\'d like to read a binary file and use something like std::string that automatically resizes the buffer and such.

I\'m using Visual C++. What are my op

5条回答
  •  花落未央
    2021-01-13 19:52

    Yes you can have embedded nulls in your std::string.

    Example:

    std::string s;
    s.push_back('\0');
    s.push_back('a');
    assert(s.length() == 2);
    

    Note: std::string's c_str() member will always append a null character to the returned char buffer; However, std::string's data() member may or may not append a null character to the returned char buffer.

    Be careful of operator+=

    One thing to look out for is to not use operator+= with a char* on the RHS. It will only add up until the null character.

    For example:

    std::string s = "hello";
    s += "\0world";
    assert(s.length() == 5);
    

    The correct way:

    std::string s = "hello";
    s += std::string("\0world", 6);
    assert(s.length() == 11);
    

    Storing binary data more common to use std::vector

    Generally it's more common to use std::vector to store arbitrary binary data.

    std::vector buf;
    buf.resize(1024);
    char *p = &buf.front();
    

    It is probably more common since std::string's data() and c_str() members return const pointers so the memory is not modifiable. with &buf.front() you are free to modify the contents of the buffer directly.

提交回复
热议问题