MFC CFile 对文件操作的有关问题 急求解决方法
MFC CFile 对文件操作的问题 急求解决办法 在线等
问题描述:
操作的文件是一个类似监控日志的txt文件(Diary.txt),为了记录打印机的打印行为。现在我希望每次往这个文件中写入内容的时候都去检查一下,如果属于同一个任务(ID相同)的文本,就去在文件中去替代之前的这行文本。简单的说就是将文件中的文本去除重复的内容。
文件截图:
每行文本分别代表 打印任务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从前写入的话,会出现覆盖情况。这样的话 就会实现去除重复的文本。
这是我的想法,如果各位发现错误,或者有更好的办法的话,恳请告知。
代码:
报错:
大家从代码上应该能看出来,本人C++新手,很多问题不懂,这个错误也看不懂,但好像是发生在ReadString这个地方。
刚注册的账号,发了几个帖目前剩170分,全部送上。
------解决方案--------------------
GetBuffer这个东西用不好很容易出错的
你用的地址引用 下面有个释放 上面还有用到 当然会崩溃了...
------解决方案--------------------
你这是 顺序文件 不能直接替换的。 需要 一行一行 地复制(包括替换)到 一个 临时 文件。
如果是 随机文件 (一个一个记录), 就可以 替换 其中 一个 记录(就是一条固定长度的记录)。
------解决方案--------------------
我大致的看了一下 我也没有去详细的分析,你先将错误定位到具体的行...
------解决方案--------------------
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吧
------解决方案--------------------
问题描述:
操作的文件是一个类似监控日志的txt文件(Diary.txt),为了记录打印机的打印行为。现在我希望每次往这个文件中写入内容的时候都去检查一下,如果属于同一个任务(ID相同)的文本,就去在文件中去替代之前的这行文本。简单的说就是将文件中的文本去除重复的内容。
文件截图:
每行文本分别代表 打印任务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;
}
报错:
大家从代码上应该能看出来,本人C++新手,很多问题不懂,这个错误也看不懂,但好像是发生在ReadString这个地方。
刚注册的账号,发了几个帖目前剩170分,全部送上。
CFile
CStdioFile
文件操作
ReadString
WriteString
------解决方案--------------------
GetBuffer这个东西用不好很容易出错的
你用的地址引用 下面有个释放 上面还有用到 当然会崩溃了...
------解决方案--------------------
你这是 顺序文件 不能直接替换的。 需要 一行一行 地复制(包括替换)到 一个 临时 文件。
如果是 随机文件 (一个一个记录), 就可以 替换 其中 一个 记录(就是一条固定长度的记录)。
------解决方案--------------------
我大致的看了一下 我也没有去详细的分析,你先将错误定位到具体的行...
------解决方案--------------------
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吧
------解决方案--------------------
那就是读出来就不对了,
你到底是要解决方法还是找错误啊
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);