我正在用C ++制作一个OpenGL游戏。与其他语言相比,我在C ++方面相当无趣。无论如何,我为一些图像创建了一个带有“base”目录的字符串流。然后我将此stringstream作为函数参数传递给构造函数。构造函数附加图像文件名,然后尝试加载生成的路径。然而...
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
}
任何人都知道为什么它会“覆盖”字符串流中的内容?
答案 0 :(得分:6)
为什么它“覆盖”字符串流中的内容
因为输出将字符放在输出缓冲区中的“put pointer”位置。新构造的流将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());
来创建输出缓冲区而不使用输出操作(并且没有推进put指针):请参阅{{ 3}}表示差异。
在任何情况下,字符串本身都可以连接起来,这样代码就更容易理解了:
std::string p = path.str() + "Ship01.tga";
std::cout << p;
更不用说为了处理文件和路径名,我们有ideone。