关于fmemopen
(2013-09-26 11:41:56)
标签:
fmemopenlinuxandroid编程jpegit |
分类: Linux |
FILE *fmemopen(void *buf, size_t size, const char
*mode);
fmemopen是将stream(一段内存)按照文件来处理,即可以使用fread, fwrite, ftell...去操作内存;
但是glibc才有这个函数,所以没有glibc的平台就只有自己实现了。
https://code.google.com/p/tesseract-android-tools/source/browse/tesseract-android-tools/jni/com_googlecode_leptonica_android/stdio/?r=f5c859a3bd7cd1e1efba38050fb6b79244971df9
这里有一个实现,分享一下。
我在ubuntu,android下都使用过,没有什么问题。
这个可以应用于诸多(支持文件操作,但不支持内存操作的)场合,如jpeg;
FILE *
fmemopen(void *buf, size_t size, const char *mode)
{
FILE
*fp;
fmemcookie
*c;
int
flags;
int
dummy;
if ((flags =
__sflags (mode, &dummy)) == 0)
return NULL;
if (!size ||
!(buf || flags & __SAPP))
{
return NULL;
}
if ((fp =
(FILE *) __sfp ()) == NULL)
return NULL;
if ((c =
(fmemcookie *) malloc (sizeof *c + (buf ? 0 : size))) ==
NULL)
{
fp->_flags =
0;
return NULL;
}
c->storage = c;
c->max =
size;
c->writeonly = (flags & __SWR) != 0;
c->saved
= '\0';
if
(!buf)
{
c->buf = (char *) (c + 1);
*(char *) buf = '\0';
c->pos = c->eof = 0;
c->append = (flags & __SAPP) != 0;
}
else
{
c->buf = (char *) buf;
switch (*mode)
{
case 'a':
buf = memchr (c->buf, '\0', size);
c->eof = c->pos = buf ? (char *) buf -
c->buf : size;
if (!buf && c->writeonly)
c->buf[size - 1] = '\0';
fmemopen是将stream(一段内存)按照文件来处理,即可以使用fread, fwrite, ftell...去操作内存;
但是glibc才有这个函数,所以没有glibc的平台就只有自己实现了。
https://code.google.com/p/tesseract-android-tools/source/browse/tesseract-android-tools/jni/com_googlecode_leptonica_android/stdio/?r=f5c859a3bd7cd1e1efba3805
这里有一个实现,分享一下。
我在ubuntu,android下都使用过,没有什么问题。
这个可以应用于诸多(支持文件操作,但不支持内存操作的)场合,如jpeg;
FILE *
fmemopen(void *buf, size_t size, const char *mode)
{