首页上一页 1 下一页尾页 1 条记录 1/1页
<>第3版程序修正
发表在C语言图书答疑
2016-03-28
是否精华
是
否
版块置顶:
是
否
以下是我对<<Visual C++从入门到精通>>第3版中的光盘关于273页实践与练习第一道答案的完善。首先说明光盘程序中存在的问题:
在《Visual C++从入门到精通》第3版的第273页 10.7实践与练习第一题,设计一个树控件来显示磁盘目录。
这题光盘上所给的答案有问题。问题出现在下面这串代码中,其中出错代码出现在OnSelchangedTrdisktree中:
while(1)
{
parent=m_trdisktree.GetParentItem(parent);
strparent=m_trdisktree.GetItemText(parent);
if(strparent.Find("\\")==2)
goto end;
temp+=strparent;
temp+="\\";
}
end:
CString root=m_trdisktree.GetItemText(parent);
lstr.Format("%s%s%s\\*.*",root,temp,rootstr);
问题就出现在上面这段代码中,当然我不得不承认这段代码设计确实挺巧妙的。但上面执行后
得到的中间路径是反向的,例如我们所点击的文件夹所在路径为D:\a\b\c\d也就是说我们正在点击d文件夹,此时
程序运行到这里后,temp得到的中间路径是,c\b\a\。很明显,这个路径的错误会影响后面一个循环对所点击
的文件夹中子文件夹的查找,其后果是就算d文件夹中有子文件夹,在树控件中也不会正常显示,该程序中只能显示到三级文件夹,就算第三级文件夹中有子文件夹,也不会在树控件中显示了。当然如果能把我上面所提到的问题解决,程序就变得比较完美了。
下面就是我的修改方案:还是在OnSelchangedTrdisktree函数中,修改代码如下:
int i=0;
CString strparent;
while(1)
{
parent=m_trdisktree.GetParentItem(parent);
strparent=m_trdisktree.GetItemText(parent);
if(strparent.Find("\\")==2)
goto end;
temp[i]=strparent;
i++;
temp[i]="\\";
i++;
}
end:
for(int n=0;n<i/2;n++){
CString t;
t=temp[n];
temp[n]=temp[i-n-1];
temp[i-n-1]=t;
}
for(int m=0;m<i;m++)temp1+=temp[m];
temp1+="\\";
CString root=m_trdisktree.GetItemText(parent);
lstr.Format("%s%s%s\\*.*",root,temp1,rootstr);
其中temp[MAX_PATH]和temp1声明在该函数前部代码如下:
CString temp[MAX_PATH],temp1;
这样修改后程序就可以显示多级文件夹了。
其实基本思路就是把所得到的字符串逆置
如谁更好的解决方案希望能分享一下,谢谢。
在《Visual C++从入门到精通》第3版的第273页 10.7实践与练习第一题,设计一个树控件来显示磁盘目录。
这题光盘上所给的答案有问题。问题出现在下面这串代码中,其中出错代码出现在OnSelchangedTrdisktree中:
while(1)
{
parent=m_trdisktree.GetParentItem(parent);
strparent=m_trdisktree.GetItemText(parent);
if(strparent.Find("\\")==2)
goto end;
temp+=strparent;
temp+="\\";
}
end:
CString root=m_trdisktree.GetItemText(parent);
lstr.Format("%s%s%s\\*.*",root,temp,rootstr);
问题就出现在上面这段代码中,当然我不得不承认这段代码设计确实挺巧妙的。但上面执行后
得到的中间路径是反向的,例如我们所点击的文件夹所在路径为D:\a\b\c\d也就是说我们正在点击d文件夹,此时
程序运行到这里后,temp得到的中间路径是,c\b\a\。很明显,这个路径的错误会影响后面一个循环对所点击
的文件夹中子文件夹的查找,其后果是就算d文件夹中有子文件夹,在树控件中也不会正常显示,该程序中只能显示到三级文件夹,就算第三级文件夹中有子文件夹,也不会在树控件中显示了。当然如果能把我上面所提到的问题解决,程序就变得比较完美了。
下面就是我的修改方案:还是在OnSelchangedTrdisktree函数中,修改代码如下:
int i=0;
CString strparent;
while(1)
{
parent=m_trdisktree.GetParentItem(parent);
strparent=m_trdisktree.GetItemText(parent);
if(strparent.Find("\\")==2)
goto end;
temp[i]=strparent;
i++;
temp[i]="\\";
i++;
}
end:
for(int n=0;n<i/2;n++){
CString t;
t=temp[n];
temp[n]=temp[i-n-1];
temp[i-n-1]=t;
}
for(int m=0;m<i;m++)temp1+=temp[m];
temp1+="\\";
CString root=m_trdisktree.GetItemText(parent);
lstr.Format("%s%s%s\\*.*",root,temp1,rootstr);
其中temp[MAX_PATH]和temp1声明在该函数前部代码如下:
CString temp[MAX_PATH],temp1;
这样修改后程序就可以显示多级文件夹了。
其实基本思路就是把所得到的字符串逆置
如谁更好的解决方案希望能分享一下,谢谢。