Yeah, addressing beyond 2Gb is typically a problem for most OSes and for the runtime library because most file position parameters are defined as (signed) ints.
You could try casting the return code to unsigned and that will get you up to 4Gb.
To seek to a position beyond the 2Gb boundary, use SEEK_END.