fread在64位iOS上没有按预期工作

时间:2015-02-09 04:52:10

标签: c++ ios iphone fread

下面有一个示例函数(由C / C ++编写)。我的问题是它在iOS 32位版本上运行良好,但在iOS 64位版本(iPhone 5s或更高版本)上它无法运行,iOS值64位上的r值始终等于0

我对这个问题没有更多的了解。请帮帮我!

long __loadData(FILE *f,UInt32 offset,size_t len,UInt8* d)
{
    if(f)
    {
        if (fseek(f, offset, SEEK_SET) < 0) return 11;
        size_t r = fread(d,1,len,f);
        return r - len;
    }
    return 1;
}

1 个答案:

答案 0 :(得分:1)

尝试:

size_t r = fread(d, (size_t)1, len, f);

我怀疑nitems基于体系结构大小,但声明为size_t

size_t fread(void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);

这样的陈述难以调试:

if (fseek(f, offset, SEEK_SET) < 0) return 11;

相反,请将其分解:

long loadData(FILE *stream, UInt32 offset, size_t length, UInt8* data)
{
    if(stream) {
        int status = fseek(stream, offset, SEEK_SET);
        if (status == -1) {
            printf("fseek errno: %d", errno);
            return 11;
        }

        size_t bytesRead = fread(data, 1, length, stream);
        if (bytesRead == 0) {
            if (ferror(stream) {
                printf("fread ferror");
            }
            if (feof(stream) {
                printf("fread feof");
            }
        }
    }
    return 1;
}

现在您可以单步执行,如果出现错误,错误编号将打印输出。

通常为了清晰起见而写,不要忽略错误消息。更好的命名有助于理解,为未来的开发人员写作,甚至可能是你。

注意:代码是用SO编写的,未经过测试。