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());
}
答案 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
用于存储文本文件的内容。