请问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抓包得到的。 多谢!
------解决方案--------------------
需要在调试时查看对应变量所指地址处的内存字节值,人工确认其内容是要写入文件的字节。
或者借助下面这段函数观察指定地址处字节值:
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))