MFC CFile 对文件操作的有关问题 急求解决方法

MFC CFile 对文件操作的问题 急求解决办法 在线等
问题描述:
 操作的文件是一个类似监控日志的txt文件(Diary.txt),为了记录打印机的打印行为。现在我希望每次往这个文件中写入内容的时候都去检查一下,如果属于同一个任务(ID相同)的文本,就去在文件中去替代之前的这行文本。简单的说就是将文件中的文本去除重复的内容
文件截图:
MFC  CFile 对文件操作的有关问题  急求解决方法

每行文本分别代表 打印任务ID,时间,打印文件名,打印机名,用户名,打印状态

其中打印任务的ID任何时候都是唯一值,不存在重复情况,上面的截图就是未经处理而存在重复的情况。如果两个任务的ID一样,那么这两个任务是同一个任务。

我的思路:

    每次将一个CString类型变量往文件中进行写入操作的时候[我用的是CStdioFile::WriteString(CString &str_write)]
都将文件从头到尾按行读一遍(ReadString(CString &str_read)),要写入的CString的格式是固定的前面五个字符是任务ID,然后从每次读出来的str_read中取出前五位,和将要写入的str_write的前五位进行比较,也就是比较它们的ID是否一样,如果一样,那么就定位到相同ID处,用WriteString()在其之前写入这个CString,那么之前的CString就会被覆盖掉,因为CFile从前写入的话,会出现覆盖情况。这样的话 就会实现去除重复的文本。 
    这是我的想法,如果各位发现错误,或者有更好的办法的话,恳请告知。

代码:
LRESULT CPrintMonitorDlg::OnUpdateFile(WPARAM wParam, LPARAM lParam)
{
CStdioFile file("Diary.txt",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite);
CString diary_txt;

int pos_txt;
POSITION pos_diary=m_diary.GetStartPosition();
while(pos_diary!=NULL)
{
CString read_str;
int key;
m_diary.GetNextAssoc(pos_diary,key,diary_txt);
file.SeekToEnd();
file.WriteString(diary_txt);
int IDtxt_Int=atoi(diary_txt.Mid(0,5));
while(file.ReadString(read_str)!=FALSE || read_str.GetLength()!=0)
{
int IDread_Int=atoi(read_str.Mid(0,5));
if(IDread_Int==IDtxt_Int)
{
file.Seek(pos_txt,CFile::begin);
file.WriteString(diary_txt);
}
else
file.WriteString(diary_txt);
pos_txt=pos_txt+strlen(read_str);
}
if(file.GetLength()==0)
{
file.WriteString(diary_txt);
}
}
return 0;
}


报错:
MFC  CFile 对文件操作的有关问题  急求解决方法

大家从代码上应该能看出来,本人C++新手,很多问题不懂,这个错误也看不懂,但好像是发生在ReadString这个地方。
刚注册的账号,发了几个帖目前剩170分,全部送上。
CFile CStdioFile 文件操作 ReadString WriteString

------解决方案--------------------
GetBuffer这个东西用不好很容易出错的
你用的地址引用  下面有个释放  上面还有用到 当然会崩溃了...

------解决方案--------------------
你这是 顺序文件 不能直接替换的。 需要 一行一行 地复制(包括替换)到 一个 临时 文件。
如果是 随机文件 (一个一个记录), 就可以 替换 其中 一个 记录(就是一条固定长度的记录)。
------解决方案--------------------
引用:
Quote: 引用:

GetBuffer这个东西用不好很容易出错的
你用的地址引用  下面有个释放  上面还有用到 当然会崩溃了...

 能说详细点吗 报错的那个截图 出错的那个filetxt.cpp这个文件我没有改动呀 
我大致的看了一下 我也没有去详细的分析,你先将错误定位到具体的行...
------解决方案--------------------
rString里面有东西吗? 

------解决方案--------------------
那就是读出来就不对了,
你到底是要解决方法还是找错误啊

CStdioFile file;
    file.Open("Diary.txt",CFile::modeReadWrite);
    CString str;
    while(true){
        file.ReadString(str);
        if(str.Left(str.Find(",",0))==CString("ID")){
            file.Seek(0,CFile::current);
            file.Write("ID............",strlen("ID.........."));
            break;
        }
    }
    file.Close();
------解决方案--------------------
SeekToEnd然后写入。
然后读取之前应该SeekToBegin吧
------解决方案--------------------
引用:
Quote: 引用:

那就是读出来就不对了,
你到底是要解决方法还是找错误啊

CStdioFile file;
    file.Open("Diary.txt",CFile::modeReadWrite);
    CString str;
    while(true){
        file.ReadString(str);
        if(str.Left(str.Find(",",0))==CString("ID")){
            file.Seek(0,CFile::current);