让我们说,我有以下文本文件:
清单1:
Endianess=little
AddressModel=32
typedef struct{
int x;
int y;
float f;
double d;
} A;
instance1:0x0000000100000002000048C19A99999999993C40
instance2:0x00100257000000090000000FBA99359976992397
其中instance1对应于struct A的实例,例如:
清单2:
A->x = 0x00000001 = 1
A->y = 0x00000002 = 2
A->f = 0x000048C1 = -12.5
A->d = 0x9A99999999993C40 = 28.6
任务:
编写一个应用程序,它将文本文件,任意C数据结构和任意内存转储打印出来,并以易于阅读的格式打印出来,重构该结构的实例(例如什么是如清单2所示。)
问题:
需要考虑的事项:
解决方案必须
奖金问题:
处理嵌入式结构的案例:
typedef struct{
int q;
int p;
A a; //embedded struct of type A defined in listing 1
} B;
先谢谢大家!
答案 0 :(得分:1)
你不能在C或C ++中使用反射,这样就可以了。这意味着您需要编写一个解析器,而不是可以读取C结构定义。真的不是很难。
如果您愿意,您可以自己完成:标记化和解析C并不难。或者你可以使用像lex和yacc这样的工具。或者你可以使用像Boost Spirit这样的C ++库。
一旦有了解析器,就可以在C中构建数据读取器。您不想在C代码中重现该结构。你只是希望能够正确阅读它。
我会在解析步骤中编写一组数据类型和名称。在二进制读取步骤中,逐步执行数组并读取需要读取的许多字节,然后生成输出行。重复,直到数组中的数据类型用完为止。