【问题标题】:C++ std::string append overwrites instead of appendingC++ std::string append 覆盖而不是追加
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-23
    • 2016-06-19
    • 2012-07-13
    • 1970-01-01
    • 2013-11-19
    • 2013-02-11
    • 2022-06-14
    相关资源
    最近更新 更多