在C ++中从CSV文件(或其他格式)分配变量

时间:2012-05-06 14:23:42

标签: c++ sql arrays visual-studio computer-science

Hello Stack Overflow world:3我的名字是Chris,我有一个小问题..所以我将以这种格式提出问题.. 第1部分 我将介绍材料和代码片段我目前正在使用该IS工作.. 第2部分 我将以最好的能力解释我希望实现目标的新方法。 第3部分 所以你们认为我没有让你完成所有的工作,我会继续前进并展示我对这个目标的尝试,以及研究挖掘出的我可能没有完全理解的方法。

第1部分

mobDB.csv示例:

ID      Sprite    kName     iName     LV  HP    SP  EXP JEXP Range1 ATK1 ATK2   DEF MDEF  STR   AGI VIT INT DEX LUK Range2  Range3  Scale   Race    Element Mode    Speed   aDelay  aMotion dMotion MEXP    ExpPer  MVP1id  MVP1per MVP2id  MVP2per MVP3id  MVP3per Drop1id Drop1per    Drop2id Drop2per    Drop3id Drop3per    Drop4id Drop4per    Drop5id Drop5per    Drop6id Drop6per    Drop7id Drop7per    Drop8id Drop8per    Drop9id Drop9per    DropCardid  DropCardper
1001    SCORPION  Scorpion  Scorpion  24  1109  0   287 176  1      80   135    30  0     1     24  24  5   52  5   10      12      0       4       23      12693   200     1564    864     576     0       0       0       0       0       0       0       0       990     70          904     5500        757     57          943     210         7041    100         508     200         625     20          0       0           0       0           4068        1
1002    PORING    Poring    Poring    1   50    0   2   1    1      7    10     0   5     1     1   1   0   6   30  10      12      1       3       21      131     400     1872    672     480     0       0       0       0       0       0       0       0       909     7000        1202    100         938     400         512     1000        713     1500        512     150         619     20          0       0           0       0           4001        1
1004    HORNET    Hornet    Hornet    8   169   0   19  15   1      22   27     5   5     6     20  8   10  17  5   10      12      0       4       24      4489    150     1292    792     216     0       0       0       0       0       0       0       0       992     80          939     9000        909     3500        1208    15          511     350         518     150         0       0           0       0           0       0           4019        1
1005    FARMILIAR Familiar  Familiar  8   155   0   28  15   1      20   28     0   0     1     12  8   5   28  0   10      12      0       2       27      14469   150     1276    576     384     0       0       0       0       0       0       0       0       913     5500        1105    20          2209    15          601     50          514     100         507     700         645     50          0       0           0       0           4020        1
1007    FABRE     Fabre     Fabre     2   63    0   3   2    1      8    11     0   0     1     2   4   0   7   5   10      12      0       4       22      385     400     1672    672     480     0       0       0       0       0       0       0       0       914     6500        949     500         1502    80          721     5           511     700         705     1000        1501    200         0       0           0       0           4002        1
1008    PUPA      Pupa      Pupa      2   427   0   2   4    0      1    2      0   20    1     1   1   0   1   20  10      12      0       4       22      256     1000    1001    1       1       0       0       0       0       0       0       0       0       1010    80          915     5500        938     600         2102    2           935     1000        938     600         1002    200         0       0           0       0           4003        1
1009    CONDOR    Condor    Condor    5   92    0   6   5    1      11   14     0   0     1     13  5   0   13  10  10      12      1       2       24      4233    150     1148    648     480     0       0       0       0       0       0       0       0       917     9000        1702    150         715     80          1750    5500        517     400         916     2000        582     600         0       0           0       0           4015        1
1010    WILOW     Willow    Willow    4   95    0   5   4    1      9    12     5   15    1     4   8   30  9   10  10      12      1       3       22      129     200     1672    672     432     0       0       0       0       0       0       0       0       902     9000        1019    100         907     1500        516     700         1068    3500        1067    2000        1066    1000        0       0           0       0           4010        1
1011    CHONCHON  Chonchon  Chonchon  4   67    0   5   4    1      10   13     10  0     1     10  4   5   12  2   10      12      0       4       24      385     200     1076    576     480     0       0       0       0       0       0       0       0       998     50          935     6500        909     1500        1205    55          601     100         742     5           1002    150         0       0           0       0           4009        1

所以这是我所拥有的电子表格的一个例子..这是我希望在我理想的目标中使用的。不是我现在使用的..它是在MS Excel 2010中完成的,使用列A-BF和第1-993行

目前我的工作代码格式,我正在使用手动实现的数组。例如对于iName我有:

char iName[16][25] = {"Scorpion", "Poring", "Hornet", "Familiar", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null"};

现在要在头文件(bSystem.h)中定义应用,让我们说他们的健康变量?我必须在同一个Header中有另一个数组,并且具有相应的顺序,如下所示:

int HP[16] = {1109, 50, 169, 155, 95, 95, 118, 118, 142, 142, 167, 167, 193, 193, 220, 220};

问题是,有大量的数据要硬编码到我需要的怪物,物品,法术,技能等各种文件中。在原始的小规模上获得某些系统使它很好..我一直在头文件中使用各种Void来调用文件中的数据。但是当我处理1000多个怪物并且不得不使用所有这些变量时......手动将它们放入其中是有点儿的。荒谬的?洛尔...

第2部分

现在我理想的系统就是能够使用.CSV文件来加载数据..我在这个任务中遇到了相当多的各种问题。比如,将从Names拉出的数据转换为一个Char数组,实际上是从CSV文件中提取数据并将特定部分分配给某些数组......我想到的主要想法是,我似乎无法理解这一点;

我希望能够找到一种方法来从CSV文件中读取这些变量...所以当我调用变量时:

cout << name << "(" << health << " health) VS. " << iName[enemy] << "(" << HP[enemy] << " health)";

其中[enemy],它将是ID ..敌人遇到的是另一个标题(lSystem.h),它基本上就是这样;

case 0:
        enemy = 0;

其中0将是涉及怪物的阵列中的第一个数据..我讨厌它必须是特定于订单的......我希望能够说敌人= 1002;因此,当战斗系统启动时,它只需从ID为1002的敌人中提取所需的变量。

我总是遇到一些不同的问题,我无法将数据从文件中提取到程序中..当我可以时,我只能将它存储到int数组中的int值,我有让它将字符串转换为字符串数组的问题..然后我提出的下一个问题是回忆它和实际的保存部分......这是第3部分的来源:3

第3部分

到目前为止,我尝试了一些不同的事情并且已经研究过如何实现这一点。到目前为止我遇到的是......

我可以编写一个函数来读取来自let的数据说mobDB,将其记录到数组中,然后输出到.dat?因此,当我需要回忆变量时,我可以从.dat而不是可修改的CSV中做一些。就读取和转换而言,我遇到了同样的问题..

我可以使用SQL路由,但是我有很多问题需要了解如何从SQL中提取数据?我家里有一个PowerEdge 2003服务器盒,我存储数据,它确实有NavicatSQL Premium设置,所以我想我的主要关于SQL路由的两个问题是,是否有可能直接挂钩到SQLServer并且我更新数据库,当客户端运行它时,只需从数据库中提取变量和数据?或者我会被困在编译SQL文件......当它是一个在线游戏时,我知道我将不得不使用一些东西从服务器转移到客户端,这就是为什么我想在dev中尽早设置它以便我有更多为了构建,我相信我可以使用SQL服务器吗?如果有人对如何工作有很好的把握,我非常想采用SQL路线..

我尝试使用类似的,Boost来解析来自CSV而不是标准库的数据。提出了同样的问题..我确实读过将字符串转换为字符串..但是这个问题在于我提取数据,我无法转换它?..

我也尝试过ADO C ++路线。死路就在那里..

总而言之,我花了大约一个星期左右。我非常想设置SQL服务器来实际更新变量......但我对任何易于编辑的工作思路持开放态度并实施大量数据..

我感谢任何帮助..如果有人试图帮助获取有效的代码,如果在部分中添加评论并不会太麻烦,您认为应该解释一下吗?我不希望别人给我一个快速解决方案..我实际上想学习和理解我正在使用的东西。非常感谢你们:))

-Chris

2 个答案:

答案 0 :(得分:0)

IMO,最简单的方法是首先创建一个包含怪物所有数据的结构。这是一个简化版本,因为我不想输入所有这些变量。

struct Mob
{
    std::string SPRITE, kName, iName;
    int ID, LV, HP, SP, EXP;
};

您特定格式的加载代码非常简单:

bool ParseMob(const std::string & str, Mob & m)
{
    std::stringstream iss(str);
    Mob tmp;
    if (iss >> tmp.ID >> tmp.SPRITE >> tmp.kName >> tmp.iName
            >> tmp.LV >> tmp.HP >> tmp.SP >> tmp.EXP)
    {
        m = tmp;
        return true;
    }
   return false;
}

std::vector<Mob> LoadMobs()
{
    std::vector<Mob> mobs;
    Mob tmp;
    std::ifstream fin("mobDB.csv");
    for (std::string line; std::getline(fin, line); )
    {
        if (ParseMob(line,tmp))
            mobs.emplace_back(std::move(tmp));
    }
    return mobs;
}

答案 1 :(得分:0)

让我们看看我是否正确理解了您的问题:您正在编写游戏,目前游戏演员的所有统计数据都是硬编码的。您已经有一个包含此数据的Excel电子表格,您只想使用它而不是硬编码的头文件,这样您就可以调整统计信息而无需等待长时间的重新编译。您当前正以列存储方式将统计信息存储在代码中,即每个属性一个数组。 CSV文件以行方式存储内容。到目前为止正确吗?

现在我对你的问题的理解变得有点模糊了。但是试试吧。如果我理解正确,您需要从代码中完全删除数组,并在需要某些生物的统计数据时直接访问CSV文件?如果是,那么这已经是问题了。文件I / O非常慢,您需要将此数据保存在主内存中。只需保留数组,但不是手动分配标题中的值,而是有一个加载函数,当您启动游戏并将其内容加载到数组中时,该函数会读取CSV文件。您可以保持其余代码不变。

示例:

void load (std::ifstream &csv)
{
    readFirstLineAndCheckThatItIsCorrect (csv);

    while (!csv.eof())
    {
        int id;
        std::string spriteName;

        csv >> id;
        csv >> spriteName >> kName[id] >> iName[id] >> LV[id] >> HP[id] >> SP[id] >> ...

        Sprite[id] = getSpriteForName (spriteName);
    }
}

使用数据库系统完全超出了范围。您需要做的就是将一些数据加载到某些数组中。如果您希望能够在不重新启动程序的情况下更改统计数据,请添加一些热键以重新加载CSV文件。

如果您打算编写在线游戏,那么您还有很长的路要走。即使这样,SQL在服务器和客户端之间交换数据也是一个非常糟糕的想法,因为a)它只是引入了过多的开销; b)它是对作弊者和黑客的公开邀请,因为如果客户可以直接访问你的数据库,你可以不再验证他们的输入。有关实际示例,请参阅http://forums.somethingawful.com/showthread.php?noseen=0&pagenumber=258&threadid=2803713。 如果您真的希望这是一款在线游戏,您需要设计自己的通信协议。但也许你应该首先阅读一些有关这方面的书籍,因为它确实是一个复杂的问题。例如,您需要通过在客户端猜测服务器和其他玩家最有可能接下来做什么来隐藏用户的延迟,并在他们错误的情况下优雅地纠正您的猜测,所有这些都没有玩家注意到(Dead Reckoning)

尽管如此,祝你好运,我希望有一天能玩这款游戏。 :-)