【问题标题】:C++ - stringstream << "overwriting"C++ - 字符串流<<“覆盖”
【发布时间】:2012-04-30 17:38:45
【问题描述】:

我正在用 C++ 制作一个 OpenGL 游戏。与其他语言相比,我在 C++ 方面相当缺乏经验。无论如何,我为一些图像创建了一个带有“基本”目录的字符串流。然后我将此字符串流作为函数参数传递给构造函数。构造函数附加一个图像文件名,然后尝试加载生成的路径。不过……

D:\CodeBlocks Projects\SnakeRoid\bin\Debug\Texts\ <-- before appending the filename
Ship01.tgacks Projects\SnakeRoid\bin\Debug\Texts\ <-- After.

显然不正确!结果应该是 D:\CodeBlocks Projects\SnakeRoid\bin\Debug\Texts\Ship01.tga

我的代码的相关部分:

std::stringstream concat;
std::string txtFullPath = "Path here";

...

concat.str(""); //Reset value (because it was changed in ...)
concat << texFullPath; //Restore the base path
PS = new PlayerShip(&TexMan, concat); //Call the constructor

构造函数的代码

PlayerShip::PlayerShip(TextureManager * TexMan, std::stringstream &path)
{
    texId = 2;
    std::cout << path.str(); //First path above
    path << "Ship01.tga";
    std::cout  << path.str(); //Second - this is the messed up one
    //Do more fun stuff
}

有人知道为什么它会“覆盖”字符串流中已有的内容吗?

【问题讨论】:

  • 很难跟踪您的代码片段。您能否制作一个 short(大约 20 行)、complete(以便我们可以下载和编译它)程序来演示该问题?请参阅sscce.org 了解更多信息。
  • @CppLearner 不是很明显吗?
  • @Seth Carnegie:但描述性更强也无妨。:)
  • 我的错,我在发布这个时很着急,有机会我会编辑更好的代码。
  • 已编辑。是不是更清楚了?

标签: c++ std stringstream


【解决方案1】:

为什么它“覆盖”字符串流中已有的内容

因为输出将字符放置在输出缓冲区中的“放置指针”位置。新构建的流的 put 指针设置为零(以追加模式打开的文件输出流除外),因此您的输出会覆盖缓冲区中已有的字符。

如果你真的需要用这种方式追加字符串,你需要将 put 指针移动到缓冲区的末尾:

std::cout << p.str(); //First path above
std::stringstream path;
path.str(p.str());
path.seekp(0, std::ios_base::end); // <-- add this
path << "Ship01.tga";
std::cout << "Loading player ship from " << path.str(); 

编辑:问题已被编辑并且编辑后的代码有效,因为它不再使用path.str(p.str()); 来创建输出缓冲区而不使用输出操作(并且不推进放置指针):请参阅ideone 了解差异。

在任何情况下,字符串本身都可以连接起来,这将使代码更容易理解:

std::string p = path.str() + "Ship01.tga";
std::cout << p;

更不用说处理文件和路径名了,我们有boost.filesystem

【讨论】:

  • 是的,这似乎有效。我来自 C# 背景,您可以使用 + 来连接大多数值(字符串、整数等),而在 C++ 中,您必须使用 StringStream 进行多类型转换并处理 char* 所以我从来没有想过简单地在两个 C++ 字符串上使用 + 虽然它现在肯定更有意义。谢谢。
  • @Xcelled194: stringstream 是将对象序列化为字符串。 string->string :D 不需要它
  • @MooingDuck 感谢提醒。
  • @MooingDuck 所以我发现 xD 我只是(错误地)假设任何 C++ 连接都是用 SS 完成的。
  • @Xcelled194:可以理解,因为许多较新的语言都有不可变的字符串,
猜你喜欢
  • 2017-01-24
  • 2015-05-01
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多