专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > VC

带 \0 的char[] 转 CString,该怎么解决

发布时间:2011-06-23 14:26:32 文章来源:www.iduyao.cn 采编人员:星星草
带 \0 的char[] 转 CString
C#写的WebService,姓名是byte[]长度40 中文 用Encoding.Unicode.GetByte转的.C#中控制了长度最大20
VC.NET 2005 用ATLSOAP_BLOB接的.之后用 memcpy将复制到char Name[40]中.
这时候,直接将char Name[40]放到CString中,并且显示到static text中是一切正常的.
CString.Format(_T("%s"),Name);

问题出现在将char Name[40]用CFile存到文件以后,再取出来.
给CString的时候就出问题了.而且有之后转换的时候.char Name[40]里面都是中文就没问题
当有英文时,Encoding.Unicode.GetByte把英文转换后另外会留下一个\0但是%s就以\0结束了.还有用大写的%S也有问题
把部分代码贴出来希望大家帮忙.

我主要做C#的.不太了解VC.NET,还请多多包含.谢谢大家
另外以前也试过WChar也失败了.主要原因个人怀疑是文件存取后编码问题.
谢谢各位高手

C/C++ code

//1.首先,接收webservice的结构体
struct WS_PERSON
{
    int PID;
    ATLSOAP_BLOB ID;
    ATLSOAP_BLOB SerialNumber;
    ATLSOAP_BLOB Name;
    WS_DATE EnrollmentDate;
    WS_DATE Birthday;
    BSTR Photo;
    ATLSOAP_BLOB Address;
    ATLSOAP_BLOB Telephone;
    unsigned char Type;
    unsigned char State;
    ATLSOAP_BLOB MagcardNumber;
    unsigned char MagcardState;
    int Version;
    int PhotoVersion;
};
//2.存取文件和显示的结构体
// 学生或教师信息
typedef struct _VCT_PERSON
{
    int            Id;                    // 编号
    char        Key[36];            // 唯一标识
    char        Code[20];            // 学号或工号
//    WCHAR        Name[20];            // 姓名
    char        Name[40];            // 姓名
    VCT_DATA    EnrollmentDate;        // 入学时间
    VCT_DATA    Birthday;            // 生日
    WCHAR        Photo[200];            // 照片地址    
//     WCHAR        Address[50];        // 地址
    char        Address[100];        // 地址
    uchar        Phone[20];            // 电话 
    char        Type;                // 学生/教师
    char        State;                // 学生状态 
    char        CardId[16];            // 卡号 
    char        CardState;            // 卡号状态
    int            Grade;                // 年级
    int            Class;                // 班级
    int            Version;            // 数据版本
    int            PhotoVersion;        // 图片版本
}VCT_PERSON,*LPVCT_PERSON;
//3.两个结构体赋值的方法
void ConvertToPerson(VCT_PERSON* dest,WS_PERSON* src)
{
    // 编号
    dest->Id=src->PID;
    // 唯一标识
    memcpy(dest->Key,src->ID.data,src->ID.size);
    // 学号/工号
    memcpy(dest->Code,src->SerialNumber.data,src->SerialNumber.size);
    // 姓名
    //_tcscpy(dest->Name,src->Name);
    memset(dest->Name,0,sizeof(dest->Name));
    memcpy(dest->Name,src->Name.data,src->Name.size);
    // 入学日期
    memcpy(&dest->EnrollmentDate,&src->EnrollmentDate,sizeof(dest->EnrollmentDate));
    // 生日
    memcpy(&dest->Birthday,&src->Birthday,sizeof(dest->Birthday));
    // 照片地址
    _tcscpy(dest->Photo,src->Photo);
    // 联系地址
    //_tcscpy(dest->Address,src->Address);
    memset(dest->Address,0,sizeof(dest->Address));
    memcpy(dest->Address,src->Address.data,src->Address.size);
    // 联系电话
    memcpy(dest->Phone,src->Telephone.data,src->Telephone.size);
    // 人物类型
    dest->Type=src->Type;
    // 学生/教师状态
    dest->State=src->State;
    // 卡号
    memcpy(dest->CardId,src->MagcardNumber.data,src->MagcardNumber.size);
    // 卡状态
    dest->CardState=src->MagcardState;
    // 年级
    dest->Grade=0;
    // 班级
    dest->Class=0;
    // 数据版本
    dest->Version=src->Version;
    // 照片版本
    dest->PhotoVersion=src->PhotoVersion;
}
//4.存取文件的方法
//存
BOOL CDBManager::SavePersonData()
{
    printf("[CDataManger::SavePersonData]\n");
    CFile file;
    if(!file.Open(PERSON_DB,CFile::modeCreate|CFile::modeReadWrite,NULL))
    {
        printf("[CDataManger::SavePersonData] open file failed!\n");
        return false;
    }

    int count=Persons.GetSize();//Persons是VCT_PERSON的一个列表,CPtrArray类型
    VCT_PERSON* p;
    for (int i=0;i<count;i++)
    {
        p=(VCT_PERSON*)Persons.GetAt(i);
        file.Write(p,sizeof(VCT_PERSON));
    }
    
    file.Close();
    return true;
}
//取
BOOL CDBManager::GetPersonData(VCT_PERSON* & data,int & dwsize)
{
    printf("[CDataManger::GetPersonData]\n");
    CFile file;    
    if(!file.Open(PERSON_DB,CFile::modeRead,NULL))
    {
        printf("[CDataManger::GetPersonData] open file failed!\n");
        return false;
    }

    int filelen;
    filelen=(int)file.GetLength();

    if((filelen%sizeof(VCT_PERSON))!=0)
    {
        printf("[CDataManger::GetPersonData] file is ruinate!\n");
        return false;
    }

    dwsize=filelen/sizeof(VCT_PERSON);

    data=(VCT_PERSON* )malloc(filelen);
    memset(data,0,filelen);
    int  rcount=0;
    while(rcount<filelen)
    {
        rcount+=file.Read(&data[rcount],filelen-rcount);
    }
    file.Close();
    return true;
}
//4.给CString的赋值
CString m_Person_Name;
m_Person_Name.Format(_T("%s"),m_Person->Name);

友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: