【请教】诡异的问题,写文件结果不是自己想要的

tiger波波 2014-07-18 10:22:19
个人感觉可能是vc6的bug

举个例子示意说明下,写文本文件:
WriteFile(_T("111111111111111111111111111111111111111111......"));
WriteFile(_T("2222222222222222222222222222222222222......."));
WriteFile(_T("3333333333333333333333333333333333333........"));
WriteFile(_T("4444444444444444444444444444444444444......."));
WriteFile(_T("5555555555555555555555555555555555555......"));
WriteFile(_T("6666666666666666666666666666666666666......."));
WriteFile(_T("777777777777777777777777777777777777777........"));
......省略5000行
WriteFile(_T("555555555555555555555555555555555555555123......")); //出错
......省略1000行

结果发现,出错的地方,
原本想往文件里写555555555555555555555555555555555555555123......,
结果程序给写成了555555555555555555555555555555555555555......

给人的感觉就是编译器把
新数据555555555555555555555555555555555555555123......
当成了以前出现过的数据555555555555555555555555555555555555555......写文件了。

如果把出错处字符串改为: 空格+555555555555555555555555555555555555555123......,
就能写文件正确,给人感觉编译器没严格比对字符串常量,数据差不多的就当成一个了,没再在常量区浪费空间。如果一开始就加个空格予以区分,就能正确。

这是别人写的程序,字符串常量较多,但也不超过10000行,优化也给关了,还是出这问题。

测试人员写的程序,不能升级VS IDE(所有测试人员都在用vc6编写类似的测试代码)
请问大家有什么建议和办法???
...全文
148 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
fronz 2014-07-24
  • 打赏
  • 举报
回复
空对空的话,只能从理论上提些建议。 尽管我还是猜你的存储过程中,内存操作有可能出错。 但如果你对编译器出错的可能性很纠结,你也需要尽力来证明是它的错误引起的。 那么你需要下面疑问的结果是否定的。 1、出错的位置是否固定? 2、更改出错位置的内容或写字节长度是否影响出错结果? 3、程序运行到出错点的流程中没有其他特异性的指令? 如可能加一些调试,或用专业VC6监控插件,监视下重要参数的变化。
tiger波波 2014-07-24
  • 打赏
  • 举报
回复

/************************************************************************/
// 函数功能:在文件末尾添加数据
// 参数:
// strFile [in]:文件路径名
// strData [in]:写文件数据
// 返回值:成功返回真,失败返回假
/************************************************************************/
BOOL CRWFile::AddStringToFile(LPCTSTR strFile, LPCTSTR strData)
{
	int ierr;
	ierr = _tfopen_s(&m_FileAdd, strFile, m_tchAddFileMode);
	if(ierr)
		return FALSE;

	m_bFileAddOpen = TRUE;

	ierr = _fputts(strData, m_FileAdd);
	if(ierr)
		return FALSE;

	fclose(m_FileAdd);

	return TRUE;

}
kuankuan_qiao 2014-07-24
  • 打赏
  • 举报
回复
或者缓冲区满了
kuankuan_qiao 2014-07-24
  • 打赏
  • 举报
回复
我觉得是拷贝到缓冲没有刷新的缘故
招财猫_Martin 2014-07-23
  • 打赏
  • 举报
回复
writefile 就是非常简单的基础函数输出,fputs函数。 不会有太多的技巧的。
schlafenhamster 2014-07-23
  • 打赏
  • 举报
回复
那 看看 你的 WritFile
tiger波波 2014-07-23
  • 打赏
  • 举报
回复
引用 10 楼 schlafenhamster 的回复:
“WriteFile(_T("111111111111111111111111111111111111111111......"));” WriteFile 只有一个参数 ? 你 自己 写的吧 ?
对,我将文件读写封装成了一个类,WriteFile只调用了fputs函数,文件指针是成员变量。
schlafenhamster 2014-07-21
  • 打赏
  • 举报
回复
“WriteFile(_T("111111111111111111111111111111111111111111......"));” WriteFile 只有一个参数 ? 你 自己 写的吧 ?
tiger波波 2014-07-21
  • 打赏
  • 举报
回复
现象目前很明显啊,诸位。 555555555555555555555555555555555555555123......前边加个空格就能输出正确,不加就变成了 555555555555555555555555555555555555555...... 而且同一个函数,几千行的输出只有4句没写对。 writefile 就是非常简单的基础函数输出,fputs函数
傻X 2014-07-21
  • 打赏
  • 举报
回复
楼主这个是基本IO啊。。应该不是微软的问题。楼主好好找找自身原因 WriteFile的实现可以贴一下看看。
lx624909677 2014-07-21
  • 打赏
  • 举报
回复
编译器要是那么智能,还要程序员干吗?
lx624909677 2014-07-21
  • 打赏
  • 举报
回复
编译器要是那么只能,还要程序员干吗?
Saleayas 2014-07-18
  • 打赏
  • 举报
回复
既然已经是错误了,难道还希望有正确的结果。 这是计算机,不是数学。
fronz 2014-07-18
  • 打赏
  • 举报
回复
直觉上判断 是存储空间是否过界或一些编写者的小过错造成的。
schlafenhamster 2014-07-18
  • 打赏
  • 举报
回复
“给人感觉编译器没严格比对字符串常量,数据差不多的就当成一个了” 先不要怀疑编译器, 这是 很 坏的习惯。 你 要 测试 各种 情况, 并且 能 重现 , 才能 报告给 微软。 你看看 你 的 exe 现在有 多少 M ?
oyljerry 2014-07-18
  • 打赏
  • 举报
回复
每次写了,都flush一下缓冲区试试
Eleven 2014-07-18
  • 打赏
  • 举报
回复

16,472

社区成员

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

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

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