加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

关于fmemopen

(2013-09-26 11:41:56)
标签:

fmemopen

linux

android

编程

jpeg

it

分类: 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';
                c->append = 1;
                break;
            case 'r':
                
                c->pos = c->append = 0;
                c->eof = size;
                break;
            case 'w':
                
                c->pos = c->append = c->eof = 0;
                *c->buf = '\0';
                break;
            default:
                abort();
        }
    }

    fp->_file = -1;
    fp->_flags = flags;
    fp->_cookie = c;
    fp->_read = flags & (__SRD | __SRW) ? fmemread : NULL;
    fp->_write = flags & (__SWR | __SRW) ? fmemwrite : NULL;
    fp->_seek = fmemseek;
    fp->_close = fmemclose;

    return fp;
}

0

阅读 收藏 喜欢 打印举报/Report
后一篇:Debug
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有