Ich nutze einfach die BBCodes…
C
#include <fstream>
#include <iostream>
#include <type_traits>
using namespace std;
class my_binary_be_ifstream : public ifstream
{
public:
typedef my_binary_be_ifstream self;
private:
template<typename T, size_t toshift>
struct read_int
{
static void exec(self& me, T& x);
};
template<typename T, bool isint>
struct read_value
{
static void exec(self& me, T& x);
};
public:
template<typename T>
self& operator>>(T& x)
{
read_value<T, is_integral<T>::value>::exec(*this, x);
return *this;
}
};
template<typename T>
struct my_binary_be_ifstream::read_value<T, true>
{
static void exec(my_binary_be_ifstream& me, T& x)
{
x = 0;
read_int<T, sizeof(T)>::exec(me, x);
}
};
template<typename T, bool b>
void my_binary_be_ifstream::read_value<T, b>::exec(my_binary_be_ifstream& me, T& x)
{
(ifstream&)(me) >> x;
}
template<typename T>
struct my_binary_be_ifstream::read_int<T, 0>
{
static void exec(my_binary_be_ifstream&, T&)
{
}
};
template<typename T, size_t toshift>
void my_binary_be_ifstream::read_int<T, toshift>::exec(my_binary_be_ifstream& me, T& x)
{
x += T(me.get()) << (toshift-1) * 8;
read_int<T, toshift - 1>::exec(me, x);
}
int main()
{
my_binary_be_ifstream in;
in.open("binary_ifstream_test.txt", ios::in);
short x;
in >> x;
cout << x << endl;
string s;
in >> s;
cout << s << endl;
}
Alles anzeigen
Ungetestet…
PS:
Big Endian ist bescheuert.
PPS:
Habs getestet und Fehler korrigiert, hatte mal wieder vergessen, dass man Funktions-Templates ja nicht partiell spezialisieren darf. Das liest jetzt alle Integer-Typen als BE-binär ein, und alle sonstigen als normalen Text. Wenn du noch Floats oder ähnliches lesen willst, musst du die Bedingung ändern, und schauen, dass das mit dem Einlesen richtig gemacht wird (Floats etwa machen ja normalerweise keine Shifts mit).