2 sinat 31675145 sinat_31675145 于 2016.03.16 15:01 提问

MFC 文件写入 WriteString 引起中断。

MFC写文件时,打开写入位置文件夹,或者刷新文件夹里的内容,就会引起中断。
我的代码如下:

CString savepath("E:\测试文件夹");
CreateDirectory(savepath,NULL);

CString filename("\test.txt");
filename = savepath + filename;

CString str;
str =_T("test2016test2016test2016test2016test2016\r\n");

CStdioFile myFile;
CFileException fileException;

while(1)
{
Sleep(1);
if(!myFile.Open(filename,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite|CFile::shareCompat|CFile::shareDenyNone),&fileException;)
{
myFile.SeekToEnd();
myFile.WriteString(str);
myFile.Close();
}
else
{
MessageBox(_T("打开文件失败"));
}
}

文件循环写入的图中,以下情况会偶尔引起中断
1,打开“测试文件夹”
2,在“测试文件夹”里按F5刷新,
3,复制test.txt文件。
4,打开test.txt文件。
当文件越来越大的时候,这样的操作引起中断更容易。
中断位置指向WriteString(str);

请问各位大神,怎么处理?哪里操作不够安全?

3个回答

baijiaheizhiganmao
baijiaheizhiganmao   2016.03.16 16:33

你while(1)的时候,在内部打开了文件,但是你if判断逻辑错误,然后文件就一直开着!因为文件打开成功了,到了else分支,while运行第二次后,你打开失败,因为前一次打开了,然后到了if的!open分支,你往里面写数据,然后close
接着while继续……现在你明白吧

a274767172
a274767172 嗯嗯嗯!知道了!omg!这个得留心了!
2 年多之前 回复
baijiaheizhiganmao
baijiaheizhiganmao   2016.03.16 15:30

你是不是逻辑错了? !myFile.Open的意思是:打开失败!此时你失败了还writeString肯定会引起中断!

 if(!myFile.Open(filename,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite|CFile::shareCompat|CFile::shareDenyNone),&fileException;)
{
myFile.SeekToEnd();
myFile.WriteString(str);
myFile.Close();
}
else
{
MessageBox(_T("打开文件失败"));
}
a274767172
a274767172 哦哦哦! 是的 我明白了! 我的语句有问题!之前那个语句是抄别人用的。修改见楼下,就可以了。多谢提醒!
2 年多之前 回复
a274767172
a274767172 可是,我那样写,为什么还可以写入呢?只是写入到后边会引起中断。
2 年多之前 回复
a274767172
a274767172   2016.03.16 16:32

代码中的,&fileException(没有分号,上面多打了。)位置放错了!导致if语句一直执行。这时候打开失败也能进入写分支。else分支一直没有用到。

原因:代码是抄别人的,没留意if里的判断。
修改方案:删除&fileException(我不太清楚它的作用)。调整if语句的判断如下,并更改写入逻辑。

if(!myFile.Open(filename,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite|CFile::shareCompat|CFile::shareDenyNone))
{
MessageBox(_T("打开文件失败,文件被占用"));
}
else
{
myFile.SeekToEnd();
myFile.WriteString(str);
myFile.Close();
}

a274767172
a274767172 回复忘世麒麟: 好的! 详细的内容我再慢慢了解。多谢~
2 年多之前 回复
a274767172
a274767172 回复忘世麒麟: 嗯!我测试过了,错误的代码里,一直走的是if分支,else没进去。这样当有一次文件被占用,无法打开时,还是进入if分支,导致writestring中断。
2 年多之前 回复
baijiaheizhiganmao
baijiaheizhiganmao 回复阿理阿why: 其实你打开失败不一定是因为文件被占用了,你可以使用GetLastError 获取错误的值,然后去搜索这个值:http://baike.baidu.com/link?url=mo3dqjjzyNSe0Tg2NEeRn0ZbBy9UZqTRR6A3shFQcddegKcz_xYhrm1Sp0C7Gz3qcHpH5_vyhH1hyCSIzk_Nuq
2 年多之前 回复
a274767172
a274767172 回复忘世麒麟: 灰常感谢了~
2 年多之前 回复
a274767172
a274767172 回复忘世麒麟: 我上面这样改动没有问题了。文件被占用也是正常通知,程序不会崩溃了。
2 年多之前 回复
baijiaheizhiganmao
baijiaheizhiganmao 每次打开前,要判断是否文件已经打开过。或者你的open和close要配对使用,不然有你疯狂的时候。
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
CStdioFile WriteString 无法写入中文 已解决
CStdioFile file; CFileException pError; setlocale( LC_CTYPE, ("chs"));  if(!file.Open(_T("ttt.txt"), CFile::modeReadWrite | CFile::modeCreate, &pError)) { MessageBox(_T("Tip"), _T("open f
CStdioFile的Writestring无法写入中文的问题
解决UNICODE字符集下CStdioFile的Writestring无法写入中文的问题2009-12-01 23:11以下代码文件以CStdioFile向无法向文本中写入中文(用notepad.exe查看不到写入的中文)CStdioFile file;file.Open(…);file.WriteString(_T("abc你好"));//只能写入abc解决办法
关于WriteString 文档覆盖换行的问题
问题:在file中用WriteString写入字符串时出现原始数据被覆盖的现象 解决办法: 1 在file.Open()中加入 CFile::modeNoTruncate,表示不清除原内容; 2 在file.WriteString(); 前加入file.SeekToEnd();,意思是将新建的内容加到最后; 举例:               CString pat
MFC中简单的文件操作writeString,readString
mfc的文件操作writerstring和readstring的用法
mfc CStdioFile 类在 UNICODE 工程中WriteString 中文写入不进文件一种解决办法
原bo  http://blog.csdn.net/xiunai78/article/details/5780845
CStdioFile之ReadString()与WriteString()注意事项
CStdioFile CObject  └CFile     └CStdioFile 一个CStdioFile对象代表一个用运行时函数fopen打开的C运行时流式文件。 流式文件是被缓冲的,而且可以以文本方式(缺省)或二进制方式打开。 文本方式提供对硬回车—换行符对的特殊处理。当你将一个换行符(0x0A)写入一个文本方式的CStdioFi
使用CStdioFile ReadString与WriteString进行文件存储操作
C++ VC 2009-10-28 08:56:07 阅读242 评论0 字号:大中小 目的:在data.txt(config.ini)中存储各种程序配置信息(文件存储形式)CString m_write;char *str;str = m_write.GetBuffer(m_write.GetLength());//将字符串转换为字符指针形式  CStdioFile file("
CStdioFile::WriteString()使用时的注意事项
最近看一段程序生成的文本文件,发现总是会隔行显示。查看代码,没有发现异样,每行结束时都会赋予“\r\n”(其实这里就是问题所在,后述)。之后二进制方式打开该文本文件,发现换行处为0x0D0x0D0x0A(对应转义符"\r\r\n")即莫名多出一个0x0D('\r')来。 查了MSDN,说“This method writes newline characters in lpsz to the
Write,writeline,WriteString函数(来自网络,全是粘贴,收集自己用)
Console类中的Write和WriteLine函数都是用来在控制台上输出字符串或含有变量的复合文本。其中,WriteLine函数用于在控制台上输出一行文本,并自动换行;而Write函数输出后不会自动换行。 对于Write和WriteLine函数来说,都可以将各种基本类型的值、对象直接输出到控制台中,且WriteLine函数可以不带参数,直接换行。 【例Ex_Write】控制台输出
MFC cstudiofile追加写文件操作
CStdioFile file; if(!file.Open("d:\\c\\a.txt",CFile::modeReadWrite)) { file.Open("d:\\c\\a.txt",CFile::modeCreate|CFile::modeReadWrite); } file.SeekToEnd(); char name[12]="sun"; in