std :: string + =运算符

时间:2012-01-25 11:10:18

标签: c++ string stl

我因为奇怪的行为而度过了糟糕的几天。我有一个std :: string,我在其上使用+ =运算符添加另一个字符串(实际上是附加到路径的文件的名称)。当我运行该程序时,我发现该文件未被找到。后来很多couts发现我正在将文件名添加到字符串的开头。

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

这个输出是“file.txt / location”!!!我尝试了一个简单的程序,它只是将两个字符串加在一起,并且工作正常,我期待(gcc v 4.3)。我已经从Windows机器上复制了代码,我没想到新文件路径之外的任何问题,它只是真正使用STL和dirent,实际上它是第一次编译或多或少。为了以防万一,我运行了dos2unix。现在我有点难过了,但是我还没有真正复制代码,而不是完全无关紧要,所以我可能会遗漏一些令人眼花缭乱的东西。

4 个答案:

答案 0 :(得分:3)

路径名是否以某种方式附加了“\ r”,因此当您将其打印到cout时,它会打印“/ home / me / location /”,返回到行的开头,然后打印“line”。 TXT“?

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

答案 1 :(得分:1)

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

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

要记住的一件事是您的代码修改了path变量。如果您针对不同的文件名重复path += file,请务必每次都重新初始化path

P.S。您发布的四行代码无法打印file.txt/location。您发布的代码与您正在运行的代码不同,或者输出不同。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

您应该使用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();