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

时间:2016-07-27 20:51:23

标签: 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 ;
}

编译器给出了错误:

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

据我所知,c_str()返回一个不能在read方法中使用的const指针,所以我改变了一点方法(你可以在下面看到)。有更好的方法吗?

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

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

3 个答案:

答案 0 :(得分:4)

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

file.read(&my_str[0], 5);

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

file.read(my_str.data(), 5);

答案 1 :(得分:1)

另一种方式,使用标准算法:

#include <iostream>
#include <string>
#include <fstream>
#include <algorithm>
#include <iterator>

using namespace std;

int main(int argc, char const *argv[])
{
    fstream file("output.bin" , ios::out | ios::binary | ios::in);

    auto my_str = string();

    copy_n(istream_iterator<char>(file), 
           5, 
           std::back_inserter(my_str));

    cout << "String = " << my_str<< endl ;
}

答案 2 :(得分:1)

std::string专门用于处理字符串和c风格的字符串,所以在这种情况下这个事实对你不利。例如你的代码:

char buffer[6];
file.read(buffer, 5);
buffer[5] = '\0';
my_str = string(buffer);

它出了什么问题?您正在阅读二进制数据,并且他们保证不会出现&#39; \ 0&#39;那个字节?您可以通过以下方式修复它:

my_str = string(buffer,5);

但这显示了一点 - std::string作为缓冲区不是一个好选择。因此,您最好使用std::vector<char>甚至更好的std::vector<uint8_t>,它具有方法data(),但不会隐式地从c-string,输出转换为std::ostream等。

相关问题