Recently, I was working on completing a port of a Linux program to Windows. It's called mpgtx, and is a command line MPEG editing program. The port was pretty easy, since it didn't use many Linux-specific functions (and someone had already done part of the port), but I did run across one big problem: it would fail on any long MPEG-2 clip. I quickly realized that it was because the
ftell functions use the data type
long for file offsets, which is a 32-bit signed integer on most systems. Therefore, those functions don't work on files that are bigger than 2048 megabytes. I then searched around for information on getting around that problem, and the only info I found was on Linux-specific functions (
ftello) or a non-buffered function (
_lseeki64). I didn't want to use Cygwin, and I really didn't want to convert all the
fseek/etc... function calls to
_lseeki64/etc... and still maintain code compatibility with Linux, so I had to find another way. I thought that because there was a
_lseeki64 function there might be a
fseeki64 function, but nothing was mentioned about that function in the Help system and hardly anything was listed when searching Google for it. One thing Google did find, though, was a page that said there was a file named "fseeki64.c" in "crt/src". Sure enough, both the fseeki64.c and ftelli64.c files existed in my "Microsoft Visual Studio .NET 2003\Vc7\crt\src" folder. Unfortunately, neither function is mentioned in stdio.h, so it's going to take a little extra work to use those functions...
Using the code
First, you'll have to add the following imports into your code:
extern "C" int __cdecl _fseeki64(FILE *, __int64, int);
extern "C" __int64 __cdecl _ftelli64(FILE *);
Note that they use
__in64 for the file offset data type, instead of
Next, replace all calls to
_ftelli64, respectively. Finally, change all the variables that you use to hold file offsets from
__int64. That's it; now you should be good to go!
Points of Interest
Does anyone know why
_ftelli64 are completely, mysteriously undocumented?