4

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

我在 Vista 上遇到了一个崩溃的错误,程序会与某个地图文件一起挂起。花了一段时间才发现不是程序而是地图文件本身。我没有注意到文本文件有任何异常。重新打开并保存地图文件修复了该问题。

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

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

4

3 回答 3

2

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

于 2010-02-24T06:24:29.603 回答
0

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

但是,即使语法没问题,您也应该始终假设内容可能不正确。

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

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

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

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

于 2010-02-24T07:32:12.827 回答
0

我想我修复了这个错误。我采取了许多步骤到达那里并且测试很顺利。

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

我暂时不考虑解析函数。如果损坏或损坏的地图文件具有有效匹配,则最终将输出该“数据”。垃圾输入/垃圾输出 (GIGO) 仍然是一个因素。以后要重温的东西。我的程序的发布版本可以在这里找到。

于 2010-02-25T04:43:56.723 回答