2012-01-25 51 views
0

對於奇怪的行爲我有一個糟糕的幾天。我有一個std ::字符串,我使用+ =操作符來添加另一個字符串(實際上是附加到路徑的文件的名稱)。當我運行程序時,我發現文件沒有找到。之後的大量cout顯示我正在將文件名添加到字符串的開頭。std :: string + =運算符

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並且直接執行,實際上它或多或少地第一次編譯。以防萬一,我跑了dos2unix。現在我有點難倒了,但是我之前並沒有真正複製過代碼,所以我可能會失去一些非常明顯的東西。

+0

你能100%排除'path'爲* file.txt *和'file'爲*/home/me/location *的可能性嗎?從這裏看來,這些變量似乎包含與您認爲應該相反的值。 –

+0

@RenéNyffenegger:請注意,字符串「file.txt」不會被預置,而會覆蓋部分路徑字符串。 – KillianDS

+0

使用'std :: cout'時,可以直接使用字符串而不使用'c_str'。另外,真的確定你沒有在某處混合使用'path'和'file'?你的問題中的代碼應該生成'「/home/me/locationfile.txt」。 –

回答

3

路徑名是否以某種方式獲得了「\ r」,因此當它打印到cout時會打印「/ home/me/location /」,返回到行首,然後打印「line 。文本」?如有人所說,用調試器查看變量。 (我的直覺是記錄/打印,但調試器也很有用)

+1

Argh,我沒有dos2unix配置文件,這是確定路徑。 *捂臉* – Bowler

1

你缺少的是目錄名和文件名之間的/分隔符。

否則,您發佈的代碼沒有任何問題。

有一點需要記住的是,您的代碼修改path變量。如果對不同的文件名重複執行path += file,請務必每次重新初始化path

P.S.您發佈的四行代碼無法打印出file.txt/location。您發佈的代碼與正在運行的代碼不同,或者輸出結果不相同。

+0

或者在導致未定義行爲的這4行之前有一些代碼。 –

+0

@Als:或這些4行之後的一些代碼*-不太可能,但是這可能是由於編譯器優化,或者因爲UB在刷新之前破壞了stdout的緩衝區。 –

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(); 
+0

爲什麼?如果你不能使用它,爲'std :: string'提供'+'有什麼意義。 –

1

它看起來像file開始於回車。如果是這種情況,+=仍然會追加filepath,但是當字符串被輸出時,它會顯示您描述的行爲。

相關問題