将二进制数据读入std :: string C ++

bar*_*mer 4 c++ string binary

我正在尝试将数据从二进制文件读取到std :: string。这是我最初尝试的内容。

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main(int argc, char const *argv[])
{
    fstream file("output.bin" , ios::out | ios::binary | ios::in);
    string my_str(5, '\0');
    file.read(my_str.c_str(), 5);
    cout << "String = " << my_str<< endl ;
}
Run Code Online (Sandbox Code Playgroud)

然后编译器给出了错误:

error: invalid conversion from ‘const char*’ to ‘std::basic_istream<char>::char_type* {aka char*}’ [-fpermissive]
  file.read(my_str.c_str(), 5);
Run Code Online (Sandbox Code Playgroud)

据我了解,c_str()返回一个const指针,该指针不能在read方法中使用,因此我做了一点改动(您可以在下面看到)。有一个更好的方法吗 ?

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main(int argc, char const *argv[])
{
    fstream file("output.bin" , ios::out | ios::binary | ios::in);
    string my_str(5, '\0');
    char buffer[6];
    file.read(buffer, 5);
    buffer[5] = '\0';
    my_str = string(buffer);

    cout << "String = " << my_str<< endl ;
}
Run Code Online (Sandbox Code Playgroud)

ps:请原谅我,如果我不能说清楚自己的话,这是我第一次来这里:)

Bar*_*rry 5

在C ++ 11中,获取const字符串数据的非指针的方法是:

file.read(&my_str[0], 5);
Run Code Online (Sandbox Code Playgroud)

C ++ 17也将const data()为此引入非:

file.read(my_str.data(), 5);
Run Code Online (Sandbox Code Playgroud)

  • 这些怪癖确实使C ++很棒。延迟35年将添加一种方便的非const方法来获取内部字符串缓冲区。 (3认同)