哪个是将二进制文件内容读取到std :: string的最佳方法?

时间:2011-06-30 08:44:47

标签: c++ file

  

可能重复:
  How to use istream with strings

std::ifstream ifile(absolute_file_path.c_str(),std::ios::binary | std::ios::in | std::ios::ate);
if (ifile.is_open()==false) 
{
    throw std::runtime_error("Unable open the file.");
}
std::stirng file_content;
//here I need good way to read full file to file_content
//note: the file is binary
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();

2.Slow

file_content.reserve(ifile.tellg());
ifile.seekg(0,std::ios::beg);
while(ifile)
{
    file_content += (char)(ifile.get());
}

2 个答案:

答案 0 :(得分:4)

如果文件是二进制文件,则它可能包含'\0',这是一个包含在std::string中的奇怪字符。虽然我认为你可以这样做,但是你会提出问题,因为std::string上的某些操作会使const char*为空终止。相反,请使用std::vector<char>,这是一种更安全的方式。

如果你仍然使用字符串,只需做一个循环调用std::string::append(size_t, char)

while(!ifile.eof()) {
   contents.append(1, ifile.get());
}

编辑:我认为你也可以做以下几点:

std::string contents(std::istreambuf_iterator<char>(ifile), std::istreambuf_iterator<char>());

答案 1 :(得分:-1)

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