* 有个Bug始终未解决:不知道是怪异还是。哎,有人摸索出了帮忙回答上
*. 有个Bug始终未解决:不知道是怪异还是。。。哎,有人摸索出了帮忙回答下
以二进制方式写入:先写入一个,结构体,再写入一串字符串,然后写入一个unsigned char 类型的Oxff字符(用作分隔)
结构体如下:
typedef struct Msg //这个结构体就按照这个样子编排顺序了,因为乱编排会导致读取数据不准确,搞不懂。
{
char strtime[20];//日期
int mode;//模式
bool isReceive ;//是否接收方,true ; 发送信息方,false
}Struct_Msg;
字符串是不定长的; 最后再写个Oxff字符进去。
问题就出来了:当我读取的时候,结构体中的 mode有时候与写入进去的值不一样:比如写入时mode = 0; 读出确实1326。。。。怎么搞的呢?求解。
------解决方案--------------------
写入结构体的时候,需要用紧凑模式,这样#pragma pack(1)设置,参考如下代码:
以二进制方式写入:先写入一个,结构体,再写入一串字符串,然后写入一个unsigned char 类型的Oxff字符(用作分隔)
结构体如下:
typedef struct Msg //这个结构体就按照这个样子编排顺序了,因为乱编排会导致读取数据不准确,搞不懂。
{
char strtime[20];//日期
int mode;//模式
bool isReceive ;//是否接收方,true ; 发送信息方,false
}Struct_Msg;
字符串是不定长的; 最后再写个Oxff字符进去。
问题就出来了:当我读取的时候,结构体中的 mode有时候与写入进去的值不一样:比如写入时mode = 0; 读出确实1326。。。。怎么搞的呢?求解。
------解决方案--------------------
写入结构体的时候,需要用紧凑模式,这样#pragma pack(1)设置,参考如下代码:
- C/C++ code
#include <stdio.h> #include <string.h> #pragma pack(1) typedef struct { char time[20]; int mode; unsigned char recv; }msg_t; int main(int argc, char* argv[]) { msg_t msg1 = {"test", 0, 1}; msg_t msg2; FILE* file; if((file = fopen("40.bin", "wb")) == NULL) return -1; fwrite(&msg1, sizeof(msg_t), 1, file); fclose(file); if((file = fopen("40.bin", "rb")) == NULL) return -1; fread(&msg2, sizeof(msg_t), 1, file); fclose(file); printf("(%s, %d, %d)\n", msg2.time, msg2.mode, msg2.recv); return 0; }
------解决方案--------------------
内存对齐的问题吧
------解决方案--------------------
1.由于内存对齐的影响,中间可能会有很多“空隙”被填充
2.typedef struct Msg {
char strtime[20];//日期
int mode;//模式
bool isReceive ;//是否接收方,true ; 发送信息方,false
}Struct_Msg;
如果mode为0,那么数据你拷贝到缓冲区在发送,字符串可能会因为'\0'而截断