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

请教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))