读书人

有writefile向文件中写入结构体的有关

发布时间: 2012-03-05 11:54:02 作者: rapoo

有writefile向文件中写入结构体的问题

C/C++ code
    FileHandle=CreateFileA(FilePath,GENERIC_READ |GENERIC_WRITE ,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_FLAG_WRITE_THROUGH,0);    if(FileHandle==INVALID_HANDLE_VALUE)    {        return false;    }    strcpy(_BasInfo.Pass,Pass);    //_BasInfo.FriendNum=FriendNum;    char *buf=new char[1021];    strcpy(buf,(char*)&_BasInfo);    //Ep(buf);    WriteFile(FileHandle,buf,sizeof(_BasInfo)+1,&Num,NULL);

如果char *buf=new char[1021];
strcpy(buf,(char*)&_BasInfo);后文件中会出现不是原来的字符.直接写结构体却没问题

[解决办法]
结构体得定义应给出,初步判断应该是结构体中内存对齐的问题
[解决办法]
(char*)&_BasInfo
结构能这么转吗
[解决办法]
你调试一下
看看转完buf里是什么东西
就明白了
[解决办法]
1 既然是结构体,如果是长度固定的话,就用二进制方式读写,怎样写进去的就怎样读出来
2 既然是写字符串,就应该使用字符串长度,你用了new 和 strcpy, buf中字符结尾后的数据并没有初始化,乱码是很正常的。
[解决办法]
char *buf=new char[1021];
zeromemory( buf, 1021);
memcpy(buf,&_BasInfo, sizeof(BasInfo));
[解决办法]
探讨
C/C++ code
WriteFile(FileHandle,buf,sizeof(_BasInfo)+1,&Num,NULL);

[解决办法]
strcpy(buf,(char*)&_BasInfo);
这里用strcpy不对,strcpy的第二个参数应当指向0结尾的字符串,而该结构体可能是任何内容,且有可能会复制结构体变量之外的内存。
可以用memcpy函数取代。
[解决办法]
假当你的结构体如下:
struct _BasInfo
{
int nXXXXX;
char *buffer;
}
如果你又
buffer = new BYTE[1024];或重新指向一个字符串

这时你写入 WriteFile(FileHandle,buf,sizeof(_BasInfo)+1,&Num,NULL);

sizeof(_BasInfo)多大?你说能不能把你的内容写完?这根本写入不到buffer中的内容.

读书人网 >VC/MFC

热点推荐