Чтобы прочитать 4 байта из ifstream
, вы можете перегрузить operator>>
следующим образом (на самом деле это частичная специализация шаблона класса basic_istream
, поэтому istream_iterator
может использовать operator>>
из него. Класс basic_ifstream
используется здесь для наследования всех функциональных возможностей потока входного файла от него):
#include <fstream>
typedef unsigned int uint32_t;
struct uint32_helper_t {};
namespace std {
template<class traits>
class basic_istream<uint32_helper_t, traits> : public basic_ifstream<uint32_t> {
public:
explicit basic_istream<uint32_helper_t, traits>(const char* filename,
ios_base::openmode mode ) : basic_ifstream<uint32_t>( filename, mode ) {}
basic_istream<uint32_helper_t, traits>& operator>>(uint32_t& data) {
read(&data, 1);
return *this;
}
};
} // namespace std {}
Тогда вы можете использовать его следующим образом:
std::basic_istream<uint32_helper_t> my_file( FILENAME, std::ios::in|std::ios::binary );
// read one int at a time
uint32_t value;
my_file >> value;
// read all data in file
std::vector<uint32_t> data;
data.assign( std::istream_iterator<uint32_t, uint32_helper_t>(my_file),
std::istream_iterator<uint32_t, uint32_helper_t>() );