.TXT文件操作的问题

qiuanhong 2002-05-10 09:35:34
一句话:如何删除文本文件中指定的数据?

要实现的功能如下:

利用文本文件存贮类似数据库的记录,能读取一比(一条或多条)数据,指定删除一条(或多条)数据(难就难在这里)....
举个例来说容易明白:
以下是文本文件的内容:(两条记录:由姓名和日期组成)
AA
2002-5-10
AA
2002-5-9

现想将上面的数据读出并添加到List Control里(每行一条记录,如:AA 2002-5-10),在List Control里选定BB记录(AA 2002-5-9),然后删除,请问该如何进行这一文件操作的动作。

关键:
1.如何选用文件操作类?CFile、CStdioFile.....
2.删除时,如何找到此记录。
3.有代码最好...

(当然,写文件时,肯定是按此格式写的)。

...全文
60 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
clin_789 2002-05-10
  • 打赏
  • 举报
回复
直接读入字符串,用c函数
hyc1980 2002-05-10
  • 打赏
  • 举报
回复
extern CListCtrl* pmyListCtrl;

UINT i, uSelectedCount = pmyListCtrl->GetSelectedCount();
int nItem = -1;

// Update all of the selected items.
if (uSelectedCount > 0)
{
for (i=0;i < uSelectedCount;i++)
{
nItem = pmyListCtrl->GetNextItem(nItem, LVNI_SELECTED);
ASSERT(nItem != -1);
pmyListCtrl->Update(nItem);
}
}
walkerliu 2002-05-10
  • 打赏
  • 举报
回复
如果记录不是太多,楼上哥们的办法可行,不过可以改进一下,使用lazy evalulation,现在内存中标记下来,不得不写的时候在总的写一次。

然而如果记录很多,不能一次读入内存,上述方法就不太合适了。最好采用内存映射文件的办法,并设计一个错误恢复机制来解决。
hyc1980 2002-05-10
  • 打赏
  • 举报
回复
可以先备份原来文件,如果出现异常,恢复原来的文件,写文本很快,就算是几兆大的一下子就可以,如果文本都有几十兆大我建议用数据库好过
qiuanhong 2002-05-10
  • 打赏
  • 举报
回复
对了,顺便问一下,在List Control选择数据时,当选择多行时,应添加哪个消息可以得到所选择的记录(行)。LVN_ITEMCHANGED消息好像不行

我的代码如下:
void CHistoryList::OnItemchangedHistoryList(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
int nSelected=pNMListView->iItem;
if (nSelected>=0)
{
TRACE("选择了第%d条记录\n",nSelected);
}
*pResult = 0;
}
qiuanhong 2002-05-10
  • 打赏
  • 举报
回复
方法很不错,我想继续听一下其它朋友的意见,看能不能找到更合适的方法,大家学习学习....

下午结帐。
freelybird 2002-05-10
  • 打赏
  • 举报
回复
朋友,我的想法是这样的

1 读数据到listCtrl或listbox时,如下:
char* pFileName = "test.txt";
CStdioFile f1;
if(f1.Open( pFileName, CFile::modeRead | CFile::shareDenyWrite ||| CFile::typeText))
{
while(...)
{
CString str;
ReadString(str);
}
//do you job
}


2 当在listCtrl删除数据时,你先把这两行数据从listCtrl删除,然后再把listCtrl中的内容写至文本文件
char* pFileName = "test.txt";
CStdioFile f1;
if( !f1.Open( pFileName, CFile::modeCreate
| CFile::modeWrite | CFile::typeText ) )
{
while(...)
{ // get CString
WriteString(str);
}
}
3 当然,也许你认为这样效率不高,但NT操作系统的文件系统在修改文件内容时,本来就需重写一遍. 再者说写一遍文本文件,应该会很快的



qiuanhong 2002-05-10
  • 打赏
  • 举报
回复
TO:
hyc1980(等待给人赏识地人)

要是记录比较多(相对来说)的话,好像有点不太安全吧
hyc1980 2002-05-10
  • 打赏
  • 举报
回复
有一个方法不知道你愿不愿意做,就是,在listview删除了数据之后,把listview里剩下的数据重新写进文件,当然文件里的原来的东西要删除掉
hyc1980 2002-05-10
  • 打赏
  • 举报
回复
有一个方法不知道你愿不愿意做,就是,在listview删除了数据之后,把剩下的数据重新写进文件,当然文件里的原来的东西要删除掉
tianlinyi 2002-05-10
  • 打赏
  • 举报
回复
这个问题我也想知道
好象MFC的类无法直接完成我们的需求把
要我们自己重载类了
qiuanhong 2002-05-10
  • 打赏
  • 举报
回复
快结账了,请大家谈谈你的方法..

UP

16,471

社区成员

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

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

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