2017-04-23 17 views
-1

私は愚かな人のように見える危険性があるので、愚かな人に尋ねる危険性があるので、これほど多くのプロジェクトをコーディングするのを止めなければならなかった。関数からC文字列を返すと、ランダムな文字が返されるのはなぜですか?

私はこのような機能を書いた:

const char* readFileToString(const char* filename) { 
    const char* result; 
    std::ifstream t(filename); 
    std::stringstream buffer; 
    buffer << t.rdbuf(); 
    result = buffer.str().c_str(); 
    return result; 
} 

file.txthelloが含まれている場合、私はreadFileToString("file.txt")helloを返す必要があること、それを期待します。代わりに、H�rv�0の行に沿って文字化けしたテキストが返されます。ただし、返品の直前にstd::cout << result;を置くと、helloと表示されます。

これはいくつかの奇妙な、不可能な奇妙なC + +ですか?どうすれば修正できますか?

+3

ローカルまたは一時的な変数へのポインタを返す無効なメモリ位置

にポイントを結果めったに良いです..

const char* readFileToString(const char* filename) { const char* result; std::ifstream t(filename); std::stringstream buffer; // Behind the scenes some memory will/is allocated buffer << t.rdbuf(); // Memory is getting filled result = buffer.str().c_str(); // Getting the address of that memory return result; // Buffer getting destroyed along with the allocated memory (what result points to) } 

をアイディア。値で返されたstd :: stringを使用してください。 –

答えて

3

奇妙でも不可能でもありません。スコープ外に出たバッファへのポインタを返しました。 const char*は文字列データを「所有」していません。または、これまでに使用されていました!返されたポインタは無効になりました。あなたはそれを逆参照してはならない。

先進的なポインタ技術に慣れるのではなく、std::stringを使うことをお勧めします。

std::string readFileToString(const char* filename) 
{ 
    std::ifstream t(filename); 
    std::stringstream buffer; 
    buffer << t.rdbuf(); 
    return buffer.str(); 
} 

残念ながら、ここではコピーを避ける方法はありません。

あなたは少しについてのあなたのデザインをシャッフル気にしない、とあなたはラインの下のストリームへの文字列のコピーを避けるためにいくつかの方法を持っている場合は、あなたの代わりにこれを行うことができれば:

void readFileToStream(const char* filename, std::ostream& os) 
{ 
    std::ifstream t(filename); 
    os << t.rdbuf(); 
} 

あなたはストリームの状態を示すboolを返すこともできますが、もう一度コールサイトで行うことができます。

1

以下の解説を参照してください:ここではそうので、それが破壊さ

関連する問題