【发布时间】:2017-09-19 11:06:24
【问题描述】:
我的游戏有 80 多个关卡,只有一个无法通过加盐 sha1 散列。原因是盐被添加到关卡文件中而不是结尾。
该问题仅在 Ubuntu 16.04 64 位中出现,在 Windows 中有效。它在每次启动时发生,并且每次都插入到相同的位置。
关卡文件有2行,第一行是关卡文件,第二行是hash。所以我得到第一行并将盐添加到它。但是单行文件的问题还是一样。
这是最小化的代码:
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
将文件硬编码到字符串流中可以正常工作。
std::stringstream inf;
inf << R"json(..)json";
【问题讨论】:
-
无法重现该问题。你用的是哪个编译器
-
这几乎是一个很好的 MCVE,但您也需要抽象输入。让这个问题成为将来对其他访问者有所帮助的问题。
-
g++ (Ubuntu 6.2.0-3ubuntu11~16.04) 6.2.0 20160901 我无法更改输入,因为正如我所说,所有其他级别都运行良好。只有这个有问题,但在 Windows 上没有。
-
@naezith 在 ubuntu 16.04 上试过,也有相同的编译器版本,仍然无法重现问题。得到应有的输出(MYSECRETSALT 在整个文件内容之后的最后打印)。我认为您应该尝试运行您提供的最少代码,看看问题是否仍然存在
-
也无法重现(lubuntu 16.04,GCC 5.4.0) - 顺便说一下:盐字符串没有插入,但似乎 覆盖 先前包含的字符串的一部分。
标签: c++ linux string file append