1 现象:问题描述
在XXX版本中处理话单时出现话单丢失现象,现场人员跟踪后发现当话单文件中存在多个不同帐期的话单时候就产生丢单现象,开发人员分析代码后发现丢单出现在话单的分流模块中,当输入话单文件中存在多个帐期时候,话单里面的一些话单记录就被后续的话单记录所覆盖,导致丢单;
2 关键过程:根本原因分析
程序中对话单的处理机制如下:
遍历输入话单文件中的所有话单记录,如果话单记录分属不同的帐期,就将该记录写到不同的帐期文件中去;
While(遍历文件中话单记录)
{
取得该行记录的帐期;
If(帐期对应的文件不存在 || 与当前打开的文件帐期不一致)
{
关闭目前打开的文件;
CEventFileWrite::open();//重开新的文件
将该条记录写入新开的文件中;
}
Else
{
直接写入当前打开的文件;
}
}
其中CEventFileWrite是封装好的一个文件读写类,但是由于没考虑清楚文件的打开模式和影响,在CEventFileWrite类中对open方法的默认模式是w+模式,导致文件采用全新打开模式,当程序中在遍历话单记录的时候,当第一条记录属于文件A,程序将文件A打开写入该记录,第2条记录属于文件B,所以程序关闭A打开B,并写入第2条记录,但是当第3条记录又属于文件A时候,问题就出现了,由于打开模式采用的w+模式,文件A被全新打开,里面的原有数据就被写入覆盖掉,造成了上面说的丢单现象;
3 结论:解决方案及效果
解决方法就是在CEventFileWrite类中将open方法的默认打开模式设置为a+模式,问题得以解决;
4 经验总结:预防措施和规范建议
文件打开方式很多种,需要清楚的知道每种打开方式的效果和影响,才能在使用的时候不至于出现使用错误:
"r"打开只读文件,该文件必须存在
"r+"打开可读写文件,该文件必须存在
"w"打开只写文件,若文件存在则清空内容,若不存在则建立该文件
"w+"打开可读写文件,若文件存在则清空内容,若不存在则建立该文件
"a"以附加方式打开只写文件,若文件不存在则建立该文件,若存在则往文件尾部追加数据,原有数据保留
"a+"以附加方式打开可读写文件,若文件不存在则建立该文件,若存在则往文件尾部追加数据,原有数据保留
上述模式还可以加上"b"或"t",表示打开的是二进制文件还是文本文件
5 备注
6 考核点
文件打开模式。
7 试题
以下说法正确的是:(D)
A. 文件打开模式为w+时候,如果文件存在,则打开文件,在文件尾部追加写入;
B. 文件打开模式为r+时候,如果文件不存在会自动创建该文件
C. 文件打开模式为w时候,如果文件不存在不会自动创建该文件
D. 文件打开模式为a+时候,如果文件不存在会自动创建,若存在则往文件尾部追加数据;
阅读(372) | 评论(0) | 转发(0) |