读书人

请问fwrite和结构的有关问题。谢谢

发布时间: 2012-08-15 16:57:17 作者: rapoo

请教fwrite和结构的问题。多谢
struct ether_header *ether;
ether = (struct ether_header*)data;

fwrite(ether->ether_dhost,sizeof(ether.ether_dhost),1,f);
fwrite(ether->ether_shost,sizeof(ether.ether_shost),1,f);
fwrite(ether->ether_type,sizeof(ether.ether_type),1,f);
问题:1,一次fopen()可以这样子连续多次写入之后再fclose吗? 2,gcc报错ether的三个元素(ether_dhost及其下面两个) in something not a structer。 是俺这样子调用结构元素的指针有问题吗?为啥报错捏。 data是用raw抓包得到的。 多谢!

[解决办法]
需要在调试时查看对应变量所指地址处的内存字节值,人工确认其内容是要写入文件的字节。
或者借助下面这段函数观察指定地址处字节值:

C/C++ code
void HexDump(char *buf,int len) {    int i,j,k;    char binstr[80];    for (i=0;i<len;i++) {        if (0==(i%16)) {            sprintf(binstr,"%04x -",i);            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);        } else if (15==(i%16)) {            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);            sprintf(binstr,"%s  ",binstr);            for (j=i-15;j<=i;j++) {                sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');            }            printf("%s\n",binstr);        } else {            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);        }    }    if (0!=(i%16)) {        k=16-(i%16);        for (j=0;j<k;j++) {            sprintf(binstr,"%s   ",binstr);        }        sprintf(binstr,"%s  ",binstr);        k=16-k;        for (j=i-k;j<i;j++) {            sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');        }        printf("%s\n",binstr);    }}
[解决办法]
1、可以多次fwrite,fopen要注意哈,在windows下必须2进制打开文件,添加b参数,否则写入非文本会出错的;
2、以下几个语句肯定有问题
fwrite(ether->ether_dhost,sizeof(ether.ether_dhost),1,f);
fwrite(ether->ether_shost,sizeof(ether.ether_shost),1,f);
fwrite(ether->ether_type,sizeof(ether.ether_type),1,f);

如果ether->ether_dhost是一个指针,则sizeof(ether.ether_dhost)就无法取得正确的长度,应该使用sizeof(*(ether.ether_dhost))

读书人网 >C语言

热点推荐