【问题标题】:What's the easiest way to parse this data?解析这些数据的最简单方法是什么?
【发布时间】:2014-05-17 20:24:58
【问题描述】:

对于我的游戏,我正在创建一个 tilemap,其中包含具有不同数字 id 的图块,例如 1、28 等。此地图数据保存到用户编辑的 .dat 文件中,看起来有点像这个:

0、83、7、2、4

现在为了让游戏生成正确的图块,它必须清楚地看到地图数据是什么。我想要这个小解析器做的是跳过空格和逗号,并获取数字数据。另外,我希望它不仅可以获取单个数字的 ID 号码,还可以获取 2-3 位数字(83 等)。

感谢您的所有帮助!

【问题讨论】:

  • 这称为 CSV(逗号分隔值)。很常见,但不是标准化的文件格式。搜索“解析 CSV”。
  • 这只是 iostream 格式输入的标准练习。如果您喜欢用逗号分隔,可以使用getline
  • 其实,这一切都是多余的。就用老脾气的fscanf()。格式“%d%*[,\n]”

标签: c++ string stl fstream stringstream


【解决方案1】:

听起来像是 strtok 函数的工作:

#include <stdlib.h>
#include <string.h>

int parseData(char* data, size_t maxAllowed, int* parsedData) {
  char * pch;
  pch = strtok (data," ,");
  int idx = 0;
  while (pch != NULL)
  {
    parsedData[idx++] = atoi(pch); //convert to integer
    if (i == maxAllowed) {
      break; //reached the maximum allowed
    }
    pch = strtok (NULL, " ,");
  }
  return i; //return the number found
}

//E.g.
char data[] ="0, 83, 7, 2, 4";
int parsedData[5];
int numFound = parseData(data,5,parsedData);

上述示例将删除所有空格和逗号,为找到的每个元素返回一个整数值以及找到的元素总数。

使用 C 函数可以轻松读取文件。您可以一次全部读取,也可以逐块读取(为每个块调用函数)。

【讨论】:

    【解决方案2】:

    这是 CSV 解析,但在旁观者看来很容易。取决于您是想“拥有”代码还是使用其他人所做的。 SO上有两个很好的答案,快速搜索有两个很好的库。

    使用预先编写的解析器的优势在于,当需要一些其他功能时,它可能已经存在。

    【讨论】:

      猜你喜欢
      • 2012-07-28
      • 2011-02-08
      • 1970-01-01
      • 2013-12-20
      • 1970-01-01
      • 2017-04-04
      • 2017-02-11
      • 1970-01-01
      • 2013-07-06
      相关资源
      最近更新 更多