「独習C# 第3版」第11章(p416) 標準ストリームリダイレクトの項目に記載されていたコードを入力後実行したら、当たり前であるがファイルを出力するだけで、ディスプレイには次の図のように何も表示されず、何が実行されたのか分からなかったので、リダイレクト前後にConsoloe.Write文の数行を追加してみました。
ところがエラー発生!
「ハンドルされていない例外:
System.ObjectDisposeException:
閉じているTextWriterに書き込むことはできません。」
図-2 エラーの様子
ソースコード
usingSystem;usingSystem.IO;usingSystem.Text;namespacep417{classRedirect{staticvoidMain(string[]args){Console.WriteLine("logfile.txtへ出力するようリダイレクト");StreamWriterlog_out;try{log_out=newStreamWriter("logfile.txt");}catch(IOExceptionexc){Console.WriteLine(exc.Message);return;}// logfile.txtへ出力するようリダイレクトConsole.SetOut(log_out);try{Console.WriteLine("This is the start of the log file.");for(inti=0;i<10;i++)Console.WriteLine(i);Console.WriteLine("This is the end of the log file.");}catch(IOExceptionexc){Console.WriteLine(exc.Message);}log_out.Close();/*
// リダイレクトをディスプレイに戻す(以下、3行を追記。/*と*/記号を外せば、エラーが修正される。)
var standardOutput = new StreamWriter(Console.OpenStandardOutput(),Encoding.Default);
standardOutput.AutoFlush = true; //StreamWriter が呼び出されるたびに、Write(Char) によって基になるストリームに対するバッファーをフラッシュするかどうかを示す値を取得または設定します。
Console.SetOut(standardOutput);
*/// ディスプレイに出力Console.WriteLine("標準出力がファイルからディスプレイに戻る。");Console.WriteLine("リダイレクトの結果logfile.txtを、実行ファイルのあるフォルダに出力しました。");Console.WriteLine();}}}
そこで、上記ソースコードの下側の/*......*/でコメントアウトした部分を追記し、解決しました。
図-3 エラー修正後の結果