如何使用ListControl控件实现读取一个列表文件?(内附详情)

consalate 2007-02-04 01:15:48
实现功能是:使用ListControl控件显示.TXT文件

给出一个.TXT的文件。内容如下。
姓名|年龄|籍贯|性别|
JOJO1 24 北京 男
JOJO2 24 北京 男
JOJO3 24 北京 男
JOJO4 24 北京 男
JOJO5 24 北京 男
JOJO6 24 北京 男
JOJO7 24 北京 男
JOJO8 24 北京 男
JOJO9 24 北京 男


要求我使用Cptrarray进行解析
使用Fopen打开文件
其中涉及到CString.Find,CString..Left,CString.Mid

由于是初学,所以对这些函数不太了解,MSDN也是看的一知半解。
请各位老大帮忙实现一下,小小分数送上。

如果觉得麻烦,可以给我一个相似的实例么?
我好自己参悟一下。谢谢。:)














































































...全文
956 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2012-10-28
  • 打赏
  • 举报
回复
三楼的 二,ListControl有AddString方法 用List控件的InsertString方法也可以
xuanruoxi 2011-06-05
  • 打赏
  • 举报
回复
lz好人,多谢啦
tanguixing 2010-07-19
  • 打赏
  • 举报
回复
呵呵,谢谢
也给了俺一些启示。
zlmhomelike 2008-01-28
  • 打赏
  • 举报
回复
资源共享
共同进步
进个人微薄之力
为中国的软件行业做贡献
xbl2003 2008-01-28
  • 打赏
  • 举报
回复
ding
consalate 2007-02-07
  • 打赏
  • 举报
回复
我先使用fopen读取文件,然后利用“|”的位置解析每个项目的位置,用CPtrArray的Mid函数的到每个项目的内容,付到变量里面。
再把变量传到用CPtrArray定义的成员IFO里。
最后用for循环SetItemText函数让文本内容一行一行显示在ListControl控件上。

明天我把代码拿回来,让后来有需要的朋友有个参考。

PS:小小分数送上,谢谢fenge1981,dsd999的指教。:)
consalate 2007-02-07
  • 打赏
  • 举报
回复
谢谢fenge1981(小一)
dsd999(二东
问题成功解决,
谁能告诉我怎么送分啊。。。。
我才来的CSDN。。。
dsd999 2007-02-07
  • 打赏
  • 举报
回复
呵呵,不错
consalate 2007-02-07
  • 打赏
  • 举报
回复
// TODO: Add extra initialization here
m_lst.InsertColumn(0, "姓名", LVCFMT_LEFT, 60);//第一个参数是索引,第二个参数是要插入的字符
m_lst.InsertColumn(1, "性别", LVCFMT_LEFT, 60);//第三个参数是左对齐,第四个参数是插入字符所
m_lst.InsertColumn(2, "年龄", LVCFMT_LEFT, 60);//占的宽度,如果为-1,则不显示这一项
m_lst.InsertColumn(3, "备注", LVCFMT_LEFT, 60);//在View->ClassWizard添加一个新的CListCtrl
m_lst.InsertColumn(4, "籍贯", LVCFMT_LEFT, 60);//成员m_lst,使其可以使用CListCtrl的
//成员函数,目的是在ListControl控件上插入一些项目列表,但是为什么要写在这里?
//因为它的作用是在在LIstControl上显示项目,需要在循环之前显示,所以要在这.




typedef struct ZhuTou //声明一个结构体,目的是为了可以缓存取得的元素.
{
char szXm[20];
char szXb[20];
char szNl[20];
char szBz[20];
char szJg[20];
}Zhu_Tou;

void CTest12Dlg::OnButton1()
{
// TODO: Add your control notification handler code here

FILE* fp = fopen("D:/MYPROJZECTS/1.txt", "r");
if(fp == NULL)
return;

CPtrArray IFO;

char szBuf[512];
while(!feof(fp)) //判断是否到达fp文件的末尾,如果没有,保持循环.
{
memset(szBuf, 0, 512); //清空szBuf,主要为了提高安全性
fgets(szBuf, 512, fp); //将fp第一行内容附给szBuf

CString str = szBuf;

int nPos1 = str.Find("|"); //解析"|"的位置是为了得到分隔符的位置,
int nPos2 = str.Find("|", nPos1+1); //从而确定内容的位置.第一个参数是要搜索的字符
int nPos3 = str.Find("|", nPos2+1); //第二个参数是起始位置.
int nPos4 = str.Find("|", nPos3+1);
//int nPos5 = /str.Find("", nPos4+1);

CString strxm = str.Mid(0, nPos1); //定义一些CString成员,使其可以使用
CString strxb = str.Mid(nPos1+1, nPos2-nPos1-1); //CString的成员函数Mid,得到需要的
CString strnl = str.Mid(nPos2+1, nPos3-nPos2-1); //元素.
CString strbz = str.Mid(nPos3+1, nPos4-nPos3-1);
CString strjg = str.Mid(nPos4+1, 4);

//得到字符串其中的一段.第一个参数是起始位置,第二个参数是要得到的字符串的长度.

Zhu_Tou* pInfo = new Zhu_Tou; //声明一个结构指针,使其可以调用这个结构的成员,来缓存
strcpy(pInfo->szXm, strxm); //各个元素.利用字符串处理函数strcpy.
strcpy(pInfo->szXb, strxb);
strcpy(pInfo->szNl, strnl);
strcpy(pInfo->szBz, strbz);
strcpy(pInfo->szJg, strjg);

IFO.Add(pInfo); //将结构指针pinfo内容全部存入CPtrArray成员IFO,使其可以
} //使用aCPtrArray的成员函数

//上面是完成读入数据,并且传入缓存,传入缓存的目的是为了使用CPtrArray的成员函数,




for(int i=0;i<IFO.GetSize();i++) //IFO.GetSize()取得的是IFO的行数.每读取一行,GetSize加1
{
Zhu_Tou* pifo = (Zhu_Tou*)IFO.GetAt(i); //定义一个指针pifo,指向IFO的元素.IFO的每
//个元素都是一行的内容,当i=0的时候,pifo指向的是IFO第一行的内容
m_lst.InsertItem(m_lst.GetItemCount(), "");//得到一行的空间,使下面要显示的
//内容有可用空间
m_lst.SetItemText(i, 0, pifo->szXm); //第一个参数,是行
m_lst.SetItemText(i, 1, pifo->szXb); //第二个参数,是列
m_lst.SetItemText(i, 2, pifo->szNl); //第三个参数指向将要输出的文本的指针
m_lst.SetItemText(i, 3, pifo->szBz);
m_lst.SetItemText(i, 4, pifo->szJg);
}

for(i=0; i<IFO.GetSize(); i++) //释放指针,释放11次.
{
Zhu_Tou* pInfo = (Zhu_Tou*)IFO.GetAt(i);
delete pInfo;
}

IFO.RemoveAll(); //
}





/*总结:任务要求是在一个ListControl上面用一个按钮实现输出指定的文本内容.
所以从总体上分为2个部分来实现,第一:读取文件,第二:显示文件.
读取文件:
1.首先读入文件,然后进行解析.
2.解析的时候,使用一些CString变量存储解析所得的元素.
3.如何解析?要找到分割元素的同一标准,在这里根据文本内容,我们使用:寻找"|"
的位置,利用CString的mid函数来提取我们所需要的元素,存储到我们需要的变量里面.
4./将结构指针pinfo内容全部存入CPtrArray成员IFO,使其可以使用aCPtrArray的成员函数
显示文件:
1.利用循环,一行一行显示.
2.添加一个LIstControl的成员,使它可以使用SetItemText函数,利用这句
m_lst.InsertItem(m_lst.GetItemCount(), "");来得到一行的空间,使下面要显示的
内容有可用空间.使用SetItemText进行文件输出.
3.最后,消除指针.
居易锦风 2007-02-05
  • 打赏
  • 举报
回复
一,读TXT
CStdioFile m_File;
CString str;
BOOL bopened = m_File.Open(LPCTSTR("d:\\test.txt"),CFile::modeReadWrite);
if(!bopened)
{
CWnd::MessageBox(LPCTSTR ("FILE CAN'T OPEN!"),LPCTSTR ("Error"),MB_OK);
return;
}
else
{
TCHAR pbuf[100];
m_File.ReadString(pbuf,100);

}

m_File.Close();
二,ListControl有AddString方法
consalate 2007-02-04
  • 打赏
  • 举报
回复
谢谢DSD999,我先参考下。:)
dsd999 2007-02-04
  • 打赏
  • 举报
回复
CString str = "JOJO1 24 北京 男";
CStringArray m_str;
int nIndex = 0;
nIndex = str.Find(" ");
while(nIndex !=-1)
{
m_str.Add(str.Left(nIndex));

str = str.Right(str.GetLength() - nIndex - 1);
nIndex = str.Find(" ");
while(nIndex ==0)
{
str = str.Right(str.GetLength() - nIndex - 1);
nIndex = str.Find(" ");
}
}
m_str.Add(str);
for(int i = 0;i<m_str.GetUpperBound()+1;i++)
{
AfxMessageBox(m_str.GetAt(i));

}

参考一下,有问题再提

16,467

社区成员

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

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

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