FILE * fl;
if((fl=fopen("ip.ini","r"))==NULL)
{
//AfxMessageBox("fopen failed");
}
else
{
CComboBox * cb=(CComboBox *)GetDlgItem(IDC_COMBIP);
cb->LimitText(15);
char ip[20];
int rc;
while(rc=fread(ip,sizeof(char),15,fl))
{
cb->AddString(ip);
}
fclose(fl);
}
上面的执行结果,在combobox里面会读出我要的ip(15个char),不过后面会有乱码。但是如果改一下fread里面的参数,把15改成16,即fread(ip,sizeof(char),16,fl),问题就解决了,不会再有乱码出现了,不知道为什么,请哪位指教,谢了!

解决方案 »

  1.   

    楼上说的对。cb->AddString函数增加的是一个字符串,传递的参数倍理解为字符串指针,
    系统判断一个字符串是否结束是依赖'\0'字符的。
    好在你定义的20长度的数组,要是15长度的数组,那么你后面的乱码没准会是什么东西呢。
    因该利用fread这个函数的返回数值rc,再增加一个
    ip[rc]='\0';
    就可以了
    或者在读取之前把ip数组清零。
      

  2.   

    妈的,这么弱智的问题也问,完了,
    老子不给你们理论了,干干脆告诉你们这一群笨蛋算了
    char ip[20];后面加上
    memset(ip,0,sizeof(ip));就行了,
    但知道为什么吗?小仔?
    因为你在cb->AddString(ip);的时候,ip是个字符数组,不是字符串,
    要将字符数组作为一个字符串来用,最后必须以NULL(也就是ASC码为0)结束,
    字符串在内存中的存储最后也是以结束符NULL(ASC码0)结尾的,
    我靠!我他娘的没法给你们解释了,
    底子太薄了,小子!知道一根木棍插在地上能拔起来,一根小树长在地上你却拔不动吗?
    根也!!!!!!!!!!
    还是候杰说得好:“没学会走之前,不要跑”
    多看看Delphi技术内幕,那上面一开始就给你讲字符串是怎么存储的。
    还有深入浅出MFC、VC技术内幕,靠,我日,你们要看的东东太多了,
    好了,不给你们理论了!!
      

  3.   

    我日,没想到被高人抢先了一步,shit!!
      

  4.   

    有这个问题,但此处并非如上所述
    因为,你定义的长度是20,而你只用了15,所以,后面的没有用。但是你忘了,当你定义后,就分配了内存,这些内存里存放着乱七八遭的字符,所以,在你定义之后,需要把这段内存清空:
    ZeroMemory(ip,20);
    这样,你这里就不会出现那种乱七八遭的字符。但是,需要另外注意的是,这里你不能定义长度是15,因为你读取的字符就是15!你定义的长度总要大于你需要用的长度,就算是大1也好。比如此处,你到少得定义其长度是16,如果你定义15,则你会发现,读出后的内容不再是15,而是有很长很长,如果你少于15,则会出现内存错误。此为经验之谈。有不对之处,请大家指出,共同学习
      

  5.   

    To: lzzqqq(Jonersen)
     你嚣张什么?
      

  6.   

    谢谢各位的发言,不过,不知道是不是我理解能力有问题,我觉得好像没有人讲到我问的重点上,就是其他的程序都没改变,而就只有fread里面的参数,把15改成16,即fread(ip,sizeof(char),16,fl),问题忽然就解决了,我希望有人能为我解释一下这个原因,再次感谢!
      

  7.   

    已知条件不够,只能猜测.也许你的ip.ini文件的第16个字节(以及其倍数字节,32,48....)是个0x00.
      

  8.   

    用fread(ip,sizeof(char),15,fl)读取的ip没有结束符'\0',所以出现乱码;用fread(ip,sizeof(char),16,fl)读取的ip含有结束符'\0',所以没有乱码;