【问题标题】:(C++) Problems with saving vector into .txt database(C++) 将向量保存到 .txt 数据库的问题
【发布时间】:2020-04-07 06:16:30
【问题描述】:

所以我有一个 .txt 数据库来存储玩家数据。每条线代表一个新玩家。例如,如果我创建 2 个播放器,则文件应如下所示。

PlayerID 0|Name|Biography|0|0|0|0|0|0
PlayerID 1|Name|Biography|0|0|0|0|0|0

我有两个问题。首先,我不确定我的角色创建功能是否有效。有一个函数可以循环字符向量并连续修改 ID(1、2、3 等)。这是函数:

int newID = 0;

Character newCharacter(name, biography, 1, 0, 100, 100, 100, 0, 0, newID);
characterVec.push_back(newCharacter);

for(unsigned int i = 0; i < characterVec.size(); i++)
{
    characterVec[i].id = i;
    activeCharacter = i;
}

第二个问题是字符保存。我确定我没有做对。该循环应该将整个字符向量写入 .txt 数据库,然后以某种方式保存它(我使用了 flush())。代码如下:

for(unsigned int i = 0; i < characterVec.size(); i++)
{
    characterDatabase << characterVec[i].id << "|";
    characterDatabase << characterVec[i].name << "|" << characterVec[i].biography << "|";
    characterDatabase << characterVec[i].level << "|" << characterVec[i].xp << "|";
    characterDatabase << characterVec[i].xpMax << "|" << characterVec[i].hp << "|";
    characterDatabase << characterVec[i].hpMax << "|" << characterVec[i].orbs << "|";
    characterDatabase << characterVec[i].diamonds << endl;
}

characterDatabase.flush();

我还有一个将文件加载到向量中的代码,但它真的很大,所以我可能会将它粘贴到网站上然后发送链接。但是,我认为这与我的问题无关。

问题是,我该如何解决玩家保存问题?还有玩家创建功能有什么问题吗?

当我运行程序时,一切正常,但是在我保存进度并重新启动它后,什么都不会加载。但是,如果我在 .txt 数据库中手动添加播放器,运行程序并打印字符列表,播放器将加载并显示。所以我的自动保存/加载代码有问题,因为它是手动工作的。

【问题讨论】:

  • 这两个函数都没有明显的问题。运行代码时实际发生了什么?仅仅说“它不起作用”是没有帮助的。输出文件是什么样的(假设你有一个)。
  • flush() 是不必要的顺便说一句
  • 如果我不得不猜测,我会说问题出在您发布的两个 sn-pts 代码周围的代码中。您是否正确打开文件,是否正确地将向量从创建代码传递到编写代码?等等等等。
  • 我编辑了这个问题来解释如果我运行程序会发生什么。
  • 你需要做的是发布一个完整的程序。它不应该是您当前的程序,它可能太大了。相反,您应该开始删除代码,同时保留您不理解的行为。当您获得尽可能小的程序时,将其发布在此处和您的数据库中。这称为最小完整可验证示例

标签: c++ file vector


【解决方案1】:

阅读文件流、std 和迭代器的字符串流 这是一些理解概念的伪代码

// pseudo code
class MyCharacterManager {
public:
    void LoadChars() {
      // do ifstream from file to string stream, do iterate of all strings each string to you character data 
      for ( auto it = /* whrite iterator over stringstream to each line get data from there*/ )
        // copy constructor involved here 
        characterVec.push_back(Character( ... ) )
    }

    void SaveChars() {
       stringstream out;
       for ( auto it = characterVec.begin(); it != characterVec.end(); it++ ) {
           string data;
           // print you data to string
           stringstream << string << endl;
       } 
       //  do write with fstream here
    }

private:
 ... characterVec;
}

【讨论】:

    猜你喜欢
    • 2023-02-04
    • 1970-01-01
    • 2021-04-28
    • 2016-02-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多