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
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.
Drag fmemopen.h and fmemopen.c to your project and add them to your target.
wherever you need to use
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 fclose(file);