繁体   English   中英

在程序崩溃之前,如何检测文本文件是否已损坏?

[英]How do you detect if a text file is corrupt before the program crashes?

我在ANSI C中编写一个命令行程序来解析Quake 2映射文件,以报告正在使用多少实体和纹理。 我的开发机器是MacBook。 我正在OS X Snow Leopard(32位),Windows XP(32位)和Vista(64位)以及Ubuntu 9.10(32位)上进行测试。

我在Vista上遇到了一个崩溃的错误,该错误会将该程序与某个映射文件挂起。 花了一段时间才弄清楚它不是程序,而是地图文件本身。 我没有发现有关文本文件的任何异常情况。 重新打开并保存地图文件可以解决该问题。

我的代码将整个地图文件加载到内存中,使用strtok()使用'\\ n'分隔行,解析每一行,然后将数据加载到单链接列表中进行处理。 有没有一种方法可以检测地图(文本)文件是否损坏?

最简单的非编程解决方案是添加包含问题和解决方案的FAQ文件。

在阅读每一行时,都会对其进行解析,以确定其是否有效。 如果您的方法失败,您可以简单地让用户知道数据已损坏,但是您仍然可以正常退出。

使用解析器生成器工具,您可以轻松检测语法错误。

但是,即使语法正确,您也应始终假定内容可能不正确。

例如,如果文件格式如下:

  • n:条目数
  • 条目1
  • 条目2
  • ...
  • 结束条件

您的代码不应仅仅分配n个大小的数组,并读取数组中的条目直到结束条件为止。 相反,您应该验证是否实际读取了n个条目(在这种情况下,请不要读取超过n个条目,以避免溢出)。

因此,请设计代码,使其不会盲目地信任输入。

我认为我已修复该错误。 我采取了一些步骤到达那里,并且测试进行顺利。

  • 在我的GCC调试组合中添加了-Wconversion。 这报告了一些有用的警告,而不是那么有用的警告。 在大多数情况下,将unsigned添加到变量类型和一些较小的(int)强制转换。
  • 虽然我的数据结构具有正确的类型(即unsigned long int),但将所有内容加在一起的输出变量却是错误的类型(即int)。 重新检查我所有的变量类型,以确保它们都匹配。
  • 添加了一个检查文件是否为零或负字节大小,以使程序暂停并出现错误。
  • 添加了一个检查,即数据列表中是否有零个节点(即,解析返回无效匹配),以通过消息文件没有可用数据来暂停程序。

我暂时不考虑解析功能。 如果损坏或损坏的地图文件具有有效的匹配项,则最终将输出该“数据”。 垃圾进/垃圾出(GIGO)仍然是一个因素。 稍后再访问的内容。 我的程序的发行版本可以在这里找到。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM