使用GetPrivateProfileSectionNames读ini文件

wzyzb 2009-12-14 02:12:17
我的程序是UNICODE 的 ,使用GetPrivateProfileSectionNames读ansi编码的ini文件,读出来的section 分割后存储到一个list中,然后AddString到listbox,listbox中出现乱码。这是为什么啊?

TCHAR chBuffer[1024];
::GetPrivateProfileSectionNames(chBuffer, 1024, strUserFile);
while (1)
{//chBuffer中没一个SectionName都以NULL结束,最后一个以两个NULL结束
while ( chBuffer[nPos++] != NULL);
if (nPos == 1)
{
return; //有可能文件已经为空
}
count = nPos -1 - startpos;
// int len=_tcslen(chBuffer);
strName.Empty();
memcpy( strName.GetBuffer(count), (chBuffer + startpos), count );
strName.ReleaseBuffer();
strlist.AddTail(strName);
startpos = nPos;
if (chBuffer[nPos] == NULL)
break;
}
}
------------------------------------

m_listboxUser.AddString(str);

...全文
529 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzyzb 2009-12-14
  • 打赏
  • 举报
回复
在UNICODE 下memcpy到底是怎么搞的
memcpy( strName.GetBuffer(count), (chBuffer + startpos), count );
改为 memcpy( strName.GetBuffer(count), (chBuffer + startpos), count×2 );就好了
????????????????
wzyzb 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 baoyufu 的回复:]
额。。。
那可能是我没搞清楚
不过我就是用这个多ini的 也是用UNICODE 读ansi编码的ini文件
[/Quote]我是读ini之后在listbox中显示出现乱码,
baoyufu 2009-12-14
  • 打赏
  • 举报
回复
额。。。
那可能是我没搞清楚
不过我就是用这个多ini的 也是用UNICODE 读ansi编码的ini文件
wzyzb 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 baoyufu 的回复:]
lz 试试这个 看看能否搞定
[/Quote]不是这个问题 是显示的问题
baoyufu 2009-12-14
  • 打赏
  • 举报
回复
lz 试试这个 看看能否搞定
baoyufu 2009-12-14
  • 打赏
  • 举报
回复

TCHAR chSectionNames[2048]={0}; //所有节名组成的字符数组
TCHAR *pSectionName; //保存找到的某个节名字符串的首地址
int i; //i指向数组chSectionNames的某个位置,从0开始,顺序后移
int j=0; //j用来保存下一个节名字符串的首地址相对于当前i的位置偏移量
int count=0; //统计节的个数

::GetPrivateProfileSectionNames(chSectionNames,2048,strUserFile);
for(i=0;i<2048;i++,j++)
{
if(chSectionNames[0]=='\0')
break; //如果第一个字符就是0,则说明ini中一个节也没有
if(chSectionNames[i]=='\0')
{
pSectionName = &chSectionNames[i-j]; //找到一个0,则说明从这个字符往前,减掉j个偏移量,就是一个节名的首地址

j=-1; //找到一个节名后,j的值要还原,以统计下一个节名地址的偏移量赋成-1是因为节名字符串的最后一个字符0是终止符,

//把读出来的值加入listbox

if(chSectionNames[i+1]==0)
{
break; //当两个相邻的字符都是0时,则所有的节名都已找到,循环终止
}
}
}
}
wzyzb 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fandh 的回复:]
看错了!
strName是什么类型?CString 吧!那么,还是应该用MultiByteToWideChar
[/Quote]
发现 ::GetPrivateProfileSectionNames(chBuffer, 1024, strUserFile);后
chBuffer虽然为宽字符,但实际存储还是char,然后

DWORD len=MultiByteToWideChar(CP_ACP,0,(char*)(chBuffer+startpos),-1,NULL,0);

MultiByteToWideChar(CP_ACP,0,(char*)(chBuffer+startpos),-1,strName.GetBuffer(len),len);
为什么老是得不到实际的字符串长度
fandh 2009-12-14
  • 打赏
  • 举报
回复
看错了!
strName是什么类型?CString 吧!那么,还是应该用MultiByteToWideChar
wzyzb 2009-12-14
  • 打赏
  • 举报
回复
在哪里用这个?在listbox中只能显示ansi字符吗?
fandh 2009-12-14
  • 打赏
  • 举报
回复
相反的!WideCharToMultiByte
wzyzb 2009-12-14
  • 打赏
  • 举报
回复
用MultiByteToWideChar 参数要求是Unsigned Short*
wzyzb 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fandh 的回复:]
楼主用的是unicode?
转化一下就行了!
[/Quote]
怎么转化?
fandh 2009-12-14
  • 打赏
  • 举报
回复
楼主用的是unicode?
转化一下就行了!

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧