2012-04-24 21 views
0

を書くときbinWriter.Writer(名前は)ファイルを使用している場合、私は、私は異なる出力ファイル

namespace BinaryStream 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string filename = @"c:\happybirthday.txt"; 
      using (BinaryWriter binWriter = 
    new BinaryWriter(File.Open(filename, FileMode.Create))) 
      { 
       string name = "Sachin"; 
       string wishes = "happy birthday"; 

       binWriter.Write(name.ToCharArray()); 
       binWriter.Write(wishes.ToCharArray()); 
      } 



     } 
    } 
} 

を使用しています。このため、バイナリファイルを作成していますが、一部の特殊文字が含まれています。しかし、文字列をchararrayに変換してファイルに書き込むと、ファイルには通常のテキスト(特殊文字は含まれません)が含まれます。

この理由は何ですか?

+1

1つはバイナリを書き、もう1つは一般的なプレーンテキストを書き込む方法なので、この場合、なぜバイナリライターを使用していますか? – yamen

+0

ファイルには2つの部分があります。1.ヘッダー - 人間が読める形式のデータを含み、その他はバイナリーデータを含む本文です。意図はこれを行うことができる1人の作家を使用することです。可能であれば、代替案を提案できますか? – Raghav55

+0

[System.IO.BinaryWriterを使用した文字列と文字配列の違い]の重複可能性(http://stackoverflow.com/questions/1014727/difference-in-writing-string-vs-char-array-with-system -io-binarywriter) –

答えて

2

Write(string)オーバーロードは長さが前置されています

をここから:http://msdn.microsoft.com/en-us/library/yzxa6408.aspx

長さ接頭辞の文字列が に文字列の長さを含む単一バイトまたはワードを付けることによって文字列の長さを表し、それは の文字列です。このメソッドは、最初に文字列の長さをUTF-7 符号なし符号なし整数として書き込み、次にBinaryWriterインスタンスの現在のエンコーディングを使用して、その多くの文字を ストリームに書き込みます。

Write(char[])はありません。その余分な情報は、テキスト表示で開いたときに奇妙なデータとして表示されます。

読み取りの動作を見ると、この理由が明らかです。 BinaryReader.ReadCharsは、読むべき文字の数を教えなければならないが、BinaryReader.ReadStringは長さのプレフィックスを調べることによってそれを動作させる。

編集:可能な重複、とにかく余分な情報:Difference in writing string vs. char array with System.IO.BinaryWriter

1

BinaryWriter.Write(文字列)が第1の長さを書き込み、ファイル内の文字列を書き込みます。だから、その文字列の長さを指し示しているファイル内の特別な文字を見つけました。

この関数のMSDNの説明:

長さ接頭辞の文字列は、文字列にその文字列の長さを含む単一バイトまたはワードを付けることによって文字列の長さを表します。このメソッドは、最初に文字列の長さをUTF-7で符号化された符号なし整数として書き込み、その後、BinaryWriterインスタンスの現在のエンコーディングを使用してそのストリームに多くの文字を書き込みます。

関連する問題