I'm trying to swap endianness in a big-endian file: my platform is little-endian, and so things are coming out wierd:

Code:
#include <iostream>
#include <fstream>

using namespace std;

// Endianness issue

inline void endian_swap(int& x) {

        // Int is 4 bytes on this machine

        x = (x >> 24) |
        ((x<<8) & 0x00FF0000) |
        ((x>>8) & 0x0000FF00) |
        (x<<24);
}

int main(int argc, char** argv) {


        const char * gcaf=argv[1];

        const float GCA_VERSION=5.0;
        const int GCA_NO_MRF = 1;
        const int GIBBS_NEIGHBORHOOD=6;
        const int GIBBS_NEIGHBORS=GIBBS_NEIGHBORHOOD;
        const int MAX_LABELS=20;

        int * v = new int;

        ifstream GCA;

        GCA.open(gcaf, ifstream::binary);


        GCA.read((char*)v, sizeof(float));

        endian_swap(v[0]);
        if (v[0] == GCA_VERSION) puts("hooray!");
        else puts("darn");


// gives the wrong answer!!!
        cout << v[0] << '\n';
}
The first four bytes in the file correspond to a `float', but I couldn't use the binary operators `>>' or `<<' with a float on either side, which is why the signature has an "int&". Any suggestions for reading in the file as little-endian? I tried googling, but didn't get much.