C++ 将二进制文件内容读入std::string的最佳方法是什么?

C++ 将二进制文件内容读入std::string的最佳方法是什么?,c++,file,C++,File,可能重复: 以下是我知道的方法: 1.可能不安全 file_content.resize(ifile.tellg()); ifile.seekg(0,std::ios::beg); if(!ifile.read(const_cast<char *>(file_content.data()), file_content.size())); { throw std::runtime_errro("failed to read file:"); } ifile.close();

可能重复:

以下是我知道的方法:

1.可能不安全

file_content.resize(ifile.tellg());
ifile.seekg(0,std::ios::beg);
if(!ifile.read(const_cast<char *>(file_content.data()), file_content.size()));
{
    throw std::runtime_errro("failed to read file:");
}
ifile.close();

您应该清楚二进制文件和字符串。您是要读取该文件的内容,还是要将该文件的二进制表示形式读取为字符串?通常使用
无符号字符[]
缓冲区来存储二进制文件的内容。而
string
用于存储文本文件的内容。

如果文件是二进制文件,它可能包含
'\0'
,这是
std::string
中包含的奇怪字符。虽然我认为您可以这样做,但您会问一些问题,因为对
std::string
的某些操作使用以null结尾的
const char*
。相反,使用
std::vector
,这是一种更安全的方法

如果仍然使用字符串,只需执行一个循环调用
std::string::append(size\u t,char)

编辑:我认为你也可以在以下方面做一些事情:

std::string contents(std::istreambuf_iterator<char>(ifile), std::istreambuf_iterator<char>());
std::string内容(std::istreambuf_迭代器(ifile),std::istreambuf_迭代器();

您可能会发现另一个问题的答案很有用:字符串不是用来保存二进制数据的,您应该使用向量之类的东西。您最好使用
while(ifile)
而不是
while(!ifile.eof())
(这可能会变成一个无休止的循环)。有关读取二进制文件的正确方法,请参见此问题:@Mihran:从简单解决方案开始,如果您有实际数据显示该解决方案速度较慢,请稍后进行优化。过早优化是万恶之源——Donaldknuth,它的
std::string
操作需要
const char*
?有些重载允许从
char
数组输入,但是
std::string
是空安全的`构造函数
std::string(const char*s)
运算符+=(const char*s)
等都将
const char*
作为参数,这意味着,如果参数为NULL,则它将被解释为您实际需要的字符串结束切片部分。当然,但它们仅为方便起见而提供,并且对于相同的输入存在(
std::string
重载)。std::string中没有以NULL结尾的固有内容。这里的类比是,如果将C字符串复制到
std::vector
中,您仍然必须使用,例如,
strlen
。还请注意,您可以为这些函数中的第一个函数提供显式大小?它是无符号字符,在Windows中是字节。请专注于想法,而不是这种细节!好的,下次我应该更加小心:-)不要建议使用原始数组。这完全没有理由,为什么不呢?这取决于你的目的。通常我们读取二进制文件是为了关心处理数据的每个字节(大约)。因此,使用原始阵列可能有助于更轻松、更快地处理数据。如果您事先知道文件大小不会大于字节数,只需使用固定数组,或者如果不知道,则使用动态数组(有很多方法可以做到这一点,如果不需要的话,我不会详细说明)是原始
char[]
或动态分配的数组(
char*
),速度明显更快(如果更快的话)比一个
向量
?因为
向量
具有明显的优势,最重要的是它不会忘记自己的大小,并且不需要手动内存管理。
file_content.reserve(ifile.tellg());
ifile.seekg(0,std::ios::beg);
while(ifile)
{
    file_content += (char)(ifile.get());
}
while(!ifile.eof()) {
   contents.append(1, ifile.get());
}
std::string contents(std::istreambuf_iterator<char>(ifile), std::istreambuf_iterator<char>());