2016-07-05 4 views
-1

私は、次のコードを実行すると、foobar_fnamefoobar_fnameときgetline実行の内容によって上書きされます:なぜstd :: getlineはファイル名を含むchar配列を上書きしますか?

foobar_fname=/home/user/fname/home/user/fnameは「シンプル・テキスト・コンテンツを」が含まれている場合、出力は次のようになり、例えば

ostringstream st_foobar_fname; 
st_foobar_fname << foostr << BAR_CONST << barstr; 
const char *foobar_fname = (st_foobar_fname.str()).c_str(); 

ifstream foobar_file(foobar_fname); 
debug("Reading '%s'", foobar_fname); 

string foobar_def = ""; 
if (getline(foobar_file, foobar_def)) { 
    debug("'%s' reported message '%s'", foobar_fname, foobar_def.c_str()); 
} else { 
    error("Unable to read '%s'", foobar_fname); 
} 

Reading '/home/user/fname' 
'simple-text-content' reported message 'simple-text-content' 

/home/user/fnameが存在しない(およびgetlineが失敗した)場合は、出力が正しい:

Reading '/home/user/fname' 
Unable to read '/home/user/fname' 

どこが間違っていますか?

(これは新しい依存関係を導入したくない古いコードなので、C++ 11、ブーストなどは実行可能なソリューションではありません)。

+1

あなたはとても親切にして[MCVE]を使用することを提供してもらえ、ここで[スターターのために何か](http://coliru.stacked-crooked.com/a/d4727423864d880e)です。 (または少なくともイドーンを試して、そこに標準入力を提供する方が簡単です) –

答えて

2

未定義の現象が発生しています。

st_foobar_fname.str() 

は、std::stringを返します。

const char *foobar_fname = (st_foobar_fname.str()).c_str(); 

は、テンポラリオブジェクトに対応しているため、行終了後に無効なポインタを格納します。一時的なオブジェクトは破壊され、あなたはぶら下がったポインタが残っています。

値を保持したい場合は、std::stringを使用してください。

std::string foobar_fname = st_foobar_fname.str(); 
+0

それはそうでした。ありがとう、良いキャッチ。 – javanix

関連する問題