2017-05-23 4 views
0

私はシンプルなユーティリティ関数を書いて一束のテキストを集めたので、数回後にテキストファイルを開いて内容を見ることができます。BinaryWriterでファイルを追加する

public static void Accumulate(string text, string path) 
{ 
    var file = File.Open(path, FileMode.Append); 

    using (var binary = new BinaryWriter(file)) 
    { 
     binary.Write(text); 
     file.Close(); 
    } 
} 

ただし、区切り文字を使用して各実行の出力を区切っても効果はありません。例えば、私はbinary.Write(text + "\n");にライターラインを変更し、その後binary.Write(text , "\n");とも試してみました:

binary.Write(text); 
binary.Write("\n"); 
file.Close(); 

しかし、どれも実際にこれがバイナリライターではなく、リテラルテキストライターであるのでおそらくある、働きません。正しい?

このプログラムを変更して、出力の間に新しい空白行を追加してください。書いたあとに次の行にジャンプしますか?

またfile.Close()の代わりにfile.Flush()を使用する必要があるのでしょうか?執筆後の適切な処分を保証するものはどれですか?

+1

: だからこれを使用しますか?テキストだけで作業する場合、 'StreamWriter'を使わないのはなぜですか? – arbiter

+1

BinaryWriterは、テキストではなくバイナリデータを厳密に書き込みます。 BinaryReaderを使用して、そのファイルを正しく読み取る必要があります。テキストファイルを読み込むプログラムがそのクラスを使用しているということはゼロです。たとえば、実際のテキストファイルを期待するプログラムのほとんどは、BinaryWriterが文字列の長さをエンコードしてファイルの終わりとしてエンコードするバイトを解釈します。代わりにFile.OpenText()を使用してどこかに取得します。 –

答えて

1

新しいラインが機能するようにするには、代わりに"\n""\r\n"を使用する必要があります。あなたはBinaryWriter` `経由で文字列を書くとき、それはテキスト自体の前にストリームにバイナリエンコードされた文字列の長さを出してあげること、あなたが理解

binary.Write(text + "\r\n"); 
+0

あなたの正解をありがとう! 'Close'の代わりに' Flush'を使うべきかどうか知っていますか? – Joshua

+1

@Joshuaこの場合、自動的に 'Close'ライターになる' using'ステートメントにライターを置いたので 'Close'を使用しないでください。 'Flush'を使うことは、バッファをクリアし、バッファされたデータを書き込むので、悪い習慣ではありません。 –

+0

多くのありがとう。最後のばかげた質問: 'binary.Write(text +" \ r \ n ")'において、改行はすべてのテキスト(つまりデータ)が書き込まれた後で確実に実行されます。右?最後にファイルが閉じる前に。正しい? – Joshua

1

バイナリライターはバイトを書き込みますので、あなたが使用する必要があります:

binary.Write (Encoding.UTF8.GetBytes (text + "\n")); 
+1

これは彼の問題を解決していません –

関連する問題