Maybe I'm crazy, but doesn't this reliably get the length of an open
file in C?  I used it in an emulator once upon a time ...

  x = tell( handle );
  file_length = lseek( handle, 0, SEEK_END );
  lseek( handle, x, SEEK_SET );

... hmm, yes, feel free to enlighten me on the fine distinctions between
files and streams here... I suspect I'm bumping up against it. 
fseek...?... [wanders off into the distance, mumbling...]