2017-09-05 13 views
3

皆さん、素晴らしいプログラマのみなさん、こんにちは。 例えばコードstd :: coutのリダイレクトの範囲

std::cout << "hello" << std::endl; 

「こんにちは」私はにリダイレクトしていたファイルに書き込まれます単語を実行するときになるように、私は、ファイルにstd::coutをリダイレクトしようとしてきました。

私はfollowigプログラムがあります。

// Redirection.cpp 
#include <iostream> 
#include <fstream> 

int main(int argc, char **argv) { 
    if(argc == 2){ 
     std::cout << "Output file supplied, redirecting to output.txt" << std::endl; 
     std::ofstream out("C:\\Avner\\HUJI\\CPP\\ex2\\output.txt"); 
     std::cout.rdbuf(out.rdbuf()); 
     std::cout << "This file contains output of Redirection.cpp" << std::endl; 
    } 
    std::cout << "This should be displayed in console or in the output file, if supplied" << std::endl; 
    return 0; 
} 

を私が読むためにoutput.txtを期待していた。

This file contains output of Redirection.cpp 
This should be displayed in console or in the output file, if supplied 

を代わりにそれが唯一の読み:

This file contains output of Redirection.cpp 

を私は理解リダイレクトそのIそのスコープにのみ適用され、外部スコープには適用されません。

どうすればこの問題を解決できますか?必要な動作は、出力ファイルが提供されている場合に限り、すべての印刷がコンソールではなくそのファイルに書き込まれるようなものです。

無料のサポートとサポートのためのおかげでありがとう!

+2

いいえ、あなたの 'out'オブジェクトは範囲外です。 – WhiZTiM

+0

' std :: endl'が行う余分なものが本当に必要ですか? '' \ n ''は行を終わらせます。 –

+0

こんにちは。私はそうは思わないが、彼らが授業で私たちに求めてきたものだ。ありがとう! – avneraggy

答えて

3

ifの変数が、ifの外側にあると宣言し、ifの終了時に範囲外にならないようにします。

int main(int argc, char *argv[]) { 
    std::ofstream out; 
    if (argc == 2) { 
     std::cout << "Output file supplied, redirecting to output.txt" << std::endl; 
     out.open("C:\\Avner\\HUJI\\CPP\\ex2\\output.txt"); 
     std::cout.rdbuf(out.rdbuf()); 
     std::cout << "This file contains output of Redirection.cpp" << std::endl; 
    } 
    std::cout << "This should be displayed in console or in the output file, if supplied" << std::endl; 
    if (out.is_open()) { 
     out.close(); 
    } 
    return 0; 
} 
+0

あなたは 'out'を閉じる必要はありません。そのデストラクタはそれを行います。 –

4
#include <iostream> 
#include <fstream> 

int main(int argc, char **argv) { 
    if(argc == 2){ 
     std::cout << "Output file supplied, redirecting to output.txt" << std::endl; 
     std::ofstream out("C:\\Avner\\HUJI\\CPP\\ex2\\output.txt"); 
     std::cout.rdbuf(out.rdbuf()); 
     std::cout << "This file contains output of Redirection.cpp" << std::endl; 
    } 
    std::cout << "This should be displayed in console or in the output file, if supplied" << std::endl; 
    return 0; 
} 

out自動ストレージ期間の対象であることを思い出してください。したがって、最後のstd::cout操作の直前の "}"で、outが破棄されます(結果として、バッファとファイルリソースが解放されます)。

ストリームバッファが有効であることを確認するには、outのままにしておいてください。これを行う方法の1つは、Barmar's answerを参照してください。

関連する問題