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),问题就解决了,不会再有乱码出现了,不知道为什么,请哪位指教,谢了!
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),问题就解决了,不会再有乱码出现了,不知道为什么,请哪位指教,谢了!
系统判断一个字符串是否结束是依赖'\0'字符的。
好在你定义的20长度的数组,要是15长度的数组,那么你后面的乱码没准会是什么东西呢。
因该利用fread这个函数的返回数值rc,再增加一个
ip[rc]='\0';
就可以了
或者在读取之前把ip数组清零。
老子不给你们理论了,干干脆告诉你们这一群笨蛋算了
char ip[20];后面加上
memset(ip,0,sizeof(ip));就行了,
但知道为什么吗?小仔?
因为你在cb->AddString(ip);的时候,ip是个字符数组,不是字符串,
要将字符数组作为一个字符串来用,最后必须以NULL(也就是ASC码为0)结束,
字符串在内存中的存储最后也是以结束符NULL(ASC码0)结尾的,
我靠!我他娘的没法给你们解释了,
底子太薄了,小子!知道一根木棍插在地上能拔起来,一根小树长在地上你却拔不动吗?
根也!!!!!!!!!!
还是候杰说得好:“没学会走之前,不要跑”
多看看Delphi技术内幕,那上面一开始就给你讲字符串是怎么存储的。
还有深入浅出MFC、VC技术内幕,靠,我日,你们要看的东东太多了,
好了,不给你们理论了!!
因为,你定义的长度是20,而你只用了15,所以,后面的没有用。但是你忘了,当你定义后,就分配了内存,这些内存里存放着乱七八遭的字符,所以,在你定义之后,需要把这段内存清空:
ZeroMemory(ip,20);
这样,你这里就不会出现那种乱七八遭的字符。但是,需要另外注意的是,这里你不能定义长度是15,因为你读取的字符就是15!你定义的长度总要大于你需要用的长度,就算是大1也好。比如此处,你到少得定义其长度是16,如果你定义15,则你会发现,读出后的内容不再是15,而是有很长很长,如果你少于15,则会出现内存错误。此为经验之谈。有不对之处,请大家指出,共同学习
你嚣张什么?