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?
I started programming by getting books on BASIC programs from the local library and entering them into QBASIC, and when I was 10 I bought a copy of Visual Basic 5 and started visual development on my 33mhz (talk about long compile times!). After a couple years I decided to learn the language that most professional programs and games were made in: C++. As soon as I learned about the power of pointers, I was addicted to programming for life
I've worked on a number of programs since then, including IGCutter
, and Freelancer Mod Manager
. I've also had the great opportunity to intern at Adobe over a summer; definitely a dream come true
I'm currently a freshman/sophomore in college, trying to stay awake in boring required classes on Java...