2012-01-25 15 views
0

私は奇妙な行動のための日の悪いカップルを持っています。私は+ =演算子を使用して別の文字列(実際にはパスに追加されるファイルの名前)を追加するstd :: stringを持っています。プログラムを実行すると、ファイルが見つからないことがわかりました。大規模な文章は後で、文字列の先頭にファイル名が追加されていることを明らかにしました。std :: string + = operator

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

出力は「file.txt/location」です。私は2つの文字列を一緒に追加する単純なプログラムを試しました。これは私が期待していた(gcc v 4.3)うまく動作します。私はWindowsマシンからコードをコピーしました。私は新しいファイルパスを越えた問題は期待していませんでしたが、実際にSTLとdirentを使用しています。私はdos2unixをちょうど実行した。今私はちょっと困っていますが、まったく些細なことを超えてコードをコピーしているわけではありません。

+0

'path'は* file.txt *、fileは*/home/me/location *の可能性を100%排除できますか?ここから、これらの変数には、あなたが思うものとは反対の値が含まれているように見えます。 –

+0

@RenéNyffenegger: "file.txt"という文字列は先頭に追加されず、パス文字列の一部を上書きします。 – KillianDS

+0

'std :: cout'を使うときは、文字列を' c_str'なしで直接使うことができます。また、 'path'と' file'をどこかで混在させていないのは本当ですか?あなたの質問のコードは '' /home/me/locationfile.txt ''を生成するはずです。 –

答えて

3

パス名に何らかの "\ r"が付いているので、それをcoutに印刷すると "/ home/me/location /"が出力され、行の先頭に戻り、 "line 。TXT"?

誰かが言ったように、デバッガで変数を見てください。 (私の本能はロギング/プリント用ですが、デバッガも便利です)

+1

ああ、私はパスを決定していた設定ファイルをdos2unixしませんでした。 * facepalm * – Bowler

1

あなたが欠けているものは、/ディレクトリ名とファイル名の区切りです。

これ以外の場合、投稿したコードに問題はありません。

あなたのコードがpath変数を変更することを覚えておいてください。別のファイル名に対してpath += fileを繰り返し実行する場合は、必ずpathを再初期化してください。

P.S.あなたが投稿したコードの4行が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が追加されますが、文字列を入力すると、記述した動作が表示されます。

関連する問題