2011-10-30 17 views
1

ストリームを生成するコードがあります。 StreamingReadStringからの返された文字列の長さは997であり、StreamReader.ReadToEnd()から返された値は空のストリームですが、人口の後ではストリームの長さは1000です(たとえば)。ここでStream.ReadStringは、StreamReader.ReadToEndがstring.Emptyを返し、両方が間違っている場合に1つの結果を返します。

は、私は(明らかに、これはまさに私の作業コードではなく、問題は同じです)何を意味するかを示すコードです:

MemoryStream stream = MethodCreatingPopulatedStream(stream); 
StreamReader reader = new StreamReader(stream); 

if (stream.Length != reader.ReadToEnd().Length) 
{ 
    PostQuestionInStackOverFlow(); 
} 
else if (!string.Equals(reader.ReadToEnd(), stream.ReadString())) 
{ 
    PostQuestionInStackOverFlow(); 
    GetAnnoyedAtDotNet(); 
} 
else 
{ 
    Smile(); 
} 

私はここで何をしないのですか?

P.Sは、Stream.Flush追加どこ変化

+2

ケントはそのほとんどをカバーしていますが、最初のブロックで 'ReadToEnd'を呼び出すと、ストリームの終わりに両方が配置されているので、ストリームまたはリーダーのどちらからも読み込むことはありません。たぶんあなたは実際にコンパイルして問題を示す短くて完全なプログラムとして* real *コードを投稿するべきです... –

答えて

2

文字列の長さ(文字)であるとは限らないストリーム(バイト)と同じ長さを行っていません。これは、文字列の格納に関連するエンコーディングやその他のオーバーヘッドに完全に依存します(長さの格納など)。

2回目のテストでは、stream.ReadString()は存在しないし、存在していれば特定のエンコーディングをとる必要があります。

+1

ReadStringはDevExpressの拡張メソッドですが、私はそれを取ったdllに気付かなかった。 – Neowizard

+0

@Neowizard:どのようなエンコーディングを使用していますか?最初に実際にどのようなデータがありますか?他の結果が期待される理由は不明です。 –

+0

文字列の長さは、文字列の長さと同じになると予想しましたが、@Kentはそこに間違いを説明しました。 – Neowizard