0

我有一段代码需要在不允许 stdio(Flash 的 Alchemy 编译器)的受限环境中运行。该代码使用标准 fopen/fread 函数,我需要将其转换为从 char* 数组中读取。关于如何最好地解决这个问题的任何想法?是否存在包装器或一些有帮助的库?

谢谢!

编辑:我还应该提到它是在结构中读取的。像这样:

fread(&myStruct, 1, sizeof(myStruct), f);
4

4 回答 4

2

我不知道有任何这样的包装纸,但我认为制作自己的包装纸不会太难。那是因为 C 的文件 I/O 方法将所有内容隐藏在FILE*接口后面,这实际上使它很好地面向对象

由于您使用的是 C 而不是 C++,因此我建议使用预处理器宏来替换fopen(),fclose()fread()withMEM_fopen()等的每个实例,这些是您将定义的例程。您将需要定义自己的FILE类型,您可以简单地使用以下内容:

typedef unsigned char *FILE;

(如果您需要管理 EOF,您将需要FILE成为一个struct带有附加length字段的人。)

然后你的MEM_fread()函数看起来像:

int MEM_fread(unsigned char *buf, size_t size, size_t n, FILE *f) {
    memcpy(buf, *f, size * n);
    *f += size * n;
    return n;
}

“构造函数”的签名MEM_fopen()可能需要稍作更改,因为您需要的标识符现在是内存地址而不是文件名。

于 2010-05-04T06:34:18.173 回答
2

glibc 有fmemstream, open_memstream, 并且open_wmemstream它们都返回一个 FILE * ,您可以直接与 stdio 文件 IO 函数一起使用,也可以调用 fclose 。

man 3 fmemopen
于 2010-05-04T19:37:51.117 回答
1

只需编写您自己的 fread() 版本即可。在 CRT 库之前将 .obj 或 .lib 传递给链接器,链接器将选择您的定义,而不是 CRT 库中的定义。

于 2010-05-04T07:30:03.270 回答
1

memcpy不够吗?围绕它编写一个具有类似签名的包装器应该很容易fread

于 2010-05-04T06:18:52.047 回答