C ++ std :: string append覆盖而不是追加

时间:2017-04-22 13:23:52

标签: c++ linux string file append

我的游戏有80多个等级,只有一个失败了盐渍的sha1散列。原因是在级别文件中添加了salt而不是它的结尾。

问题仅出现在64位Ubuntu 16.04中,适用于Windows。它发生在每次发射时,每次都插入到同一位置。

级别文件是2行,第一行是级别文件,第二行是哈希。所以我得到第一行并加盐。但问题仍然与单行文件相同。

这是最小化的代码:

int main() {
    std::ifstream inf("level.txt");
    std::string lvl_file;
    std::getline(inf, lvl_file);
    inf.close();

    lvl_file += "MYSECRETSALT"; // lvl_file.append(..) also has same issue
    std::cout << lvl_file << std::endl;
}

此代码打印整个级别文件,但MYSECRETSALT进入它的内部而不是它的结尾。如果我在追加之前打印lvl_file,它会很好地打印而不会遗漏任何内容。

// IT SHOULD BE LIKE
...[0,26],[1,61]],"decor_2":[[0,25000]],"decor_3":[[0,25000]],"tiles_3":[[0,25000]]},"ghosts":[],"turrets":[]}MYSECRETSALT

// BUT IT PRINTS LIKE THIS
...[0,26],[1,61]],"decor_2":[[0,25000]],"decorMYSECRETSALT0]],"tiles_3":[[0,25000]]},"ghosts":[],"turrets":[]}

级别文件位于以下位置:https://hastebin.com/ayeduwucid.php

将文件硬编码到stringstream中可以正常工作。

    std::stringstream inf;
    inf << R"json(..)json";

1 个答案:

答案 0 :(得分:0)

该文件是用Windows编写的,它带到\n的第二行。当我用十六进制检查时,它实际上会导致\r\n导致这些问题。