免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: miaoxins
打印 上一主题 下一主题

如何以流的形式把结构体打印出来呢? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-07-10 14:07 |只看该作者
printBuf( void*p, int siz )
{
     for( int i =1; i<=siz; i++)
     {
            if( i %0x10 == 0 )
            {
                  printf( "\n" );
            }
            printf( "%c ", (char)(*(p+i-1) ) );
     }
}

论坛徽章:
0
12 [报告]
发表于 2008-07-10 17:43 |只看该作者
楼上那样,达不到我想要的效果。而且也多次调用了printf函数

论坛徽章:
0
13 [报告]
发表于 2008-07-10 18:46 |只看该作者
建议你看一下tcpdump的print-ascii.c
函数的定义大概是 ascii_print(char *p, int len)

0x0000   4510 005c d5f6 4000 4006 e04c c0a8 0139        E..\..@.@..L...9
0x0010   c0a8 01bf 0016 0ed5 5bdf 7e19 797e 0cde        ........[.~.y~..
0x0020   5018 ffff da02 0000 dcef 04dc 748d 8b8d        P...........t...
0x0030   376d 7698 5bbe 8b51 da0c f73e 01eb 8411        7mv.[..Q...>....
0x0040   a1a9 dc5b fd0a ea7e 11fd e8de 1b7c 460a        ...[...~.....|F.
0x0050   08c0 1ffa ef23 7b4e 02ec bbbd                  .....#{N....

我一直用它来打印内存中的数据

论坛徽章:
0
14 [报告]
发表于 2008-07-10 19:13 |只看该作者

回复 #13 caijimin 的帖子

关键是楼主是想要一串没有类型的32位数字 还是有类型的内容

否则一个简单的memorydump就可以了

直接write到stdout

论坛徽章:
0
15 [报告]
发表于 2008-07-10 19:46 |只看该作者
不知道楼主想干什么?
如果仅仅只是打印:将结构体重载 << 用 cout 打印。

论坛徽章:
0
16 [报告]
发表于 2008-07-10 20:23 |只看该作者
用蛮力序列化,最好能做通用一点,加上类型解析

论坛徽章:
0
17 [报告]
发表于 2008-07-10 21:17 |只看该作者
我没搞清楚lz这样打出来有啥实质的用途

这样看变量的值,不是很费劲吗?

论坛徽章:
0
18 [报告]
发表于 2009-11-25 16:41 |只看该作者
我想很多人没有明白楼主的意思。
声明一结构体:
typedef struct {
char   ca;
short  sb;
int      ic;
// ...
// ...
} example_t;
若定义:
example_t* tmp;
tmp.ca = 0xFF;
tmp.sb = 0x00FF;
tmp.ic = 0x000000FF;
// ...
// ...
想必楼主希望用一条printf语句打印出其所有成员的值,而不需要罗列所有变量的成员名,打印出来应该是这个样子:
>0xFF
>0x00FF
>0x000000FF
>...
>...

我搜了一下,一个被定义了的结构体,其起始地址、大小、每个成员的size和offset是可以计算出来的:



#define container_of(ptr, type, member) ({ \
     const typeof( ((type *)0)->member ) *__mptr = (ptr); \
     (type *)( (char *)__mptr - offsetof(type,member) );})
#define FSIZE(type, field) sizeof(((type*)0)->field)
#define FPOS(type, field) ((dword) & ((type*)0)->field)
但是,在C语言这一层,如果没有field变量名,我想,应该是求不出size和offset的吧。
如果能解决这个问题,那对任一结构体的遍历打印,应该是可以简单地实现了。反之,楼主的问题就无解。

论坛徽章:
0
19 [报告]
发表于 2009-11-26 10:14 |只看该作者
用GDB撒,一个P命令就ok啦

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
20 [报告]
发表于 2009-11-26 17:47 |只看该作者
原帖由 miaoxins 于 2008-7-10 11:43 发表
我想利用一个CHAR类型的指针指向一个结构体的起始地址,只用一个打印函数就把整个结构体以流的形式打印出来。如果不以这种形式处理的话,一个结构体成员很多的话,打印函数会调用很多次。不知道这样怎么写呢?

这贴也是类似问题
http://bbs.chinaunix.net/viewthread.php?tid=1614144
http://bbs2.chinaunix.net/viewth ... p;extra=&page=1

[ 本帖最后由 yulihua49 于 2009-11-26 17:50 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP