我有一段代码需要在不允许 stdio(Flash 的 Alchemy 编译器)的受限环境中运行。该代码使用标准 fopen/fread 函数,我需要将其转换为从 char* 数组中读取。关于如何最好地解决这个问题的任何想法?是否存在包装器或一些有帮助的库?
谢谢!
编辑:我还应该提到它是在结构中读取的。像这样:
fread(&myStruct, 1, sizeof(myStruct), f);
我不知道有任何这样的包装纸,但我认为制作自己的包装纸不会太难。那是因为 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()
可能需要稍作更改,因为您需要的标识符现在是内存地址而不是文件名。
glibc 有fmemstream
, open_memstream
, 并且open_wmemstream
它们都返回一个 FILE * ,您可以直接与 stdio 文件 IO 函数一起使用,也可以调用 fclose 。
man 3 fmemopen
只需编写您自己的 fread() 版本即可。在 CRT 库之前将 .obj 或 .lib 传递给链接器,链接器将选择您的定义,而不是 CRT 库中的定义。
memcpy
不够吗?围绕它编写一个具有类似签名的包装器应该很容易fread
。