собсвенно как-то так:| Код | #include <vector> #include <fstream>
std::vector<char>& load_file(std::string const& filename, std::vector<char>& buffer) { buffer.clear(); std::ifstream file(filename.c_str(), std::ios::binary); if (file.bad()) { return buffer; }
char symbol; buffer.reserve(static_cast<std::string::size_type>(file.rdbuf()->in_avail())); while (file.get(symbol)) { if (buffer.capacity() == buffer.size()) { buffer.reserve(buffer.capacity() * 3); } buffer.push_back(symbol); }
return buffer; }
void save_file(std::string const& filename, std::vector<char> const& buffer) { std::ofstream file(filename.c_str(), std::ios::binary | std::ios::trunc); if (file) { file.write(&buffer[0], buffer.size()); } }
|
или можно сделать более лаконично на std::copy, стримовых итерараторах и std::back_inserter| Код | #include <vector> #include <fstream> #include <iterator> #include <algorithm>
std::vector<char>& load_file(std::string const& filename, std::vector<char>& buffer) { std::ifstream file(filename.c_str(), std::ios::binary);
buffer.clear(); buffer.reserve(static_cast<std::string::size_type>(file.rdbuf()->in_avail())); std::copy( std::istream_iterator<char>(file) , std::istream_iterator<char>() , std::back_inserter(buffer) );
return buffer; }
void save_file(std::string const& filename, std::vector<char> const& buffer) { std::ofstream file(filename.c_str(), std::ios::binary | std::ios::trunc); std::copy( buffer.begin() , buffer.end() , std::ostream_iterator<char>(file) ); }
|
|