搜尋

首頁  >  問答  >  主體

c++ - 过于结构体,存进char *的buff,再写入文件

struct data
{
    u_short sin_port;
    struct  in_addr sin_addr;
    unsigned char id;
};

struct data Data[141];

char *buf,*buf1,
buf1 = (char *)malloc(10000);
memset(buf1, 0, 10000);

for (i =0;i< 141;i++)
 {
        memcpy(buf1, &Data[i].id,20);
        printf("buf11: %x\n", buf1);
        buf1+=20;
        memcpy(buf1, &Data[i].sin_addr, 4);
        buf1+=4;
        memcpy(buf1, &Data[i].sin_port, 2);
        buf1+=2;
        size1 += 26;
 }
 buf1 -= size1;
   
write(fd2, buf1, size1+1);
close(fd2);
free(buf1);

我发现这样写入的数据总是不对/?请教哪里有问题啊?一般都是先写入buffer,再写入文件?

天蓬老师天蓬老师2773 天前447

全部回覆(4)我來回復

  • 天蓬老师

    天蓬老师2017-04-17 14:52:46

    buf1是字串型,應該有結束符號‘0’來收尾,否則會有亂碼。

    回覆
    0
  • 阿神

    阿神2017-04-17 14:52:46

    1.標題「過於結構體」 , 應該是「對結構體」
    2.「char buf, buf1,」 , 最好用西文分號結束。
    3.記憶體拷貝memcpy的具體意義參考下標準手冊,按你的意思,應該是這個函數第三個參數問題。

    ……

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 14:52:46

    賦值前先初始化buf = buf1 儲存資料起始位置
    最後使用buf而不是buf1寫入資料write(fd2, buf, size1+1);
    buf1 -= size1 也是多餘處理

    回覆
    0
  • 阿神

    阿神2017-04-17 14:52:46

    不要這麼麻煩。你頂一個struct的指針,指向"buf指針強轉型後的位置",然後將你要copy的struct賦值過來即可。
    char* buf = new char[100];
    struct Data d1; // init d1
    struct Data d2 = (struct Data)buf;
    *d2 = d1 ;

    這是buf空間的前對應位元組空間即儲存了d1的值

    回覆
    0
  • 取消回覆