Fork me on GitHub
<< back to documentation

fmemopen for Mac OS and iOS

Originally ported from ingenuitas python-tesseract. Ported by Jeff Verkoeyen under the Apache 2.0 License.

From the fmemopen man page:

FILE *fmemopen(void *buf, size_t size, const char *mode);

The fmemopen() function opens a stream that permits the access specified by mode. The stream allows I/O to be performed on the string or memory buffer pointed to by buf. This buffer must be at least size bytes long.

Alas, this method does not exist on BSD operating systems (specifically Mac OS X and iOS). It is possible to recreate this functionality using a BSD-specific method called funopen.

From the funopen man page:

FILE * funopen(const void *cookie, int (*readfn)(void *, char *, int), int (*writefn)(void *, const char *, int), fpos_t (*seekfn)(void *, fpos_t, int), int (*closefn)(void *));

The funopen() function associates a stream with up to four ``I/O functions’’. Either readfn or writefn must be specified; the others can be given as an appropriately-typed NULL pointer. These I/O functions will be used to read, write, seek and close the new stream.

fmemopen.c provides a simple implementation of fmemopen using funopen so that you can create FILE pointers to blocks of memory.

Adding it to your Project

Drag fmemopen.h and fmemopen.c to your project and add them to your target. #include "fmemopen.h" wherever you need to use fmemopen.


#import "fmemopen.h"

NSString* string = @"fmemopen in Objective-C";
const char* cstr = [string UTF8String];
FILE* file = fmemopen((void *)cstr, sizeof(char) * (string.length + 1), "r");

// fread on file will now read the contents of the NSString