std::string += operator

std::string += operator

本文关键字:operator string std      更新时间:2023-10-16

我这几天表现不好。我有一个std::字符串,在这个字符串上我使用+=运算符来添加另一个字符串(实际上是附加到路径的文件名)。当我运行程序时,我发现没有找到文件。Copious couts后来透露,我正在将文件名添加到字符串的开头。

std::string path("/home/me/location/");
std::string file("file.txt");
path += file;
std::cout << path.c_str();

它的输出是"file.txt/location"!!!我尝试了一个简单的程序,它只需将两个字符串添加在一起,就可以很好地工作,这是我所期望的(gcc v4.3)。我从windows机器上复制了代码,除了新的文件路径之外,我没有想到会有任何问题,它只真正使用STL和dirent,事实上,它或多或少是第一次编译的。我运行dos2unix只是以防万一。现在我有点困惑,但除了完全琐碎的事情之外,我以前还没有真正复制过代码,所以我可能错过了一些显而易见的东西。

路径名是否以某种方式附加了一个"\r",这样当您将其打印到cout时,它会打印"/home/me/location/",返回行首,然后打印"line.txt"?

正如有人所说,使用调试器查看变量。(我的直觉也是记录/打印,但调试器也很有用)

缺少目录名和文件名之间的/分隔符。

否则,您发布的代码没有任何问题。

需要记住的一点是,您的代码会修改path变量。如果对不同的文件名重复执行path += file,请确保每次都重新初始化path

附言:你发布的四行代码不可能打印出file.txt/location。要么发布的代码与正在运行的代码不同,要么输出不相同。

看起来file回车开始。如果是这种情况,+=仍然会将file附加到path,但当字符串被定制时,它会显示您描述的行为。

您应该为此使用std::stringstream

std::stringstream tempss;
std::string path("/home/me/location");
std::string file("file.txt");
tempss << path;
tempss << file;
std::string filepath = tempss.str();