「独習C# 第3版」第11章(p416) 標準ストリームリダイレクトの項目に記載されていたコードを入力後実行したら、当たり前であるがファイルを出力するだけで、ディスプレイには次の図のように何も表示されず、何が実行されたのか分からなかったので、リダイレクト前後にConsoloe.Write文の数行を追加してみました。
ところがエラー発生!
「ハンドルされていない例外:
System.ObjectDisposeException:
閉じているTextWriterに書き込むことはできません。」
図-2 エラーの様子
ソースコード
using System;
using System.IO;
using System.Text;
namespace p417
{
class Redirect
{
static void Main(string[] args)
{
Console.WriteLine("logfile.txtへ出力するようリダイレクト");
StreamWriter log_out;
try
{
log_out = new StreamWriter("logfile.txt");
}
catch (IOException exc)
{
Console.WriteLine(exc.Message);
return;
}
// logfile.txtへ出力するようリダイレクト
Console.SetOut(log_out);
try
{
Console.WriteLine("This is the start of the log file.");
for (int i = 0; i < 10; i++) Console.WriteLine(i);
Console.WriteLine("This is the end of the log file.");
}
catch (IOException exc)
{
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 エラー修正後の結果