54

バイナリリーダーのファイルの終わりに到達したかどうかを確認する方法を探していました。1つの提案は、PeekCharをそのまま使用することでした。

while (inFile.PeekChar() > 0)
{
    ...
}

しかし、問題が発生したようです

未処理の例外:System.ArgumentException:出力charバッファーが小さすぎます
デコードされた文字を含むll、エンコード'Unicode(UTF-8)'フォールバック'Syste
m.Text.DecoderReplacementFallback'。
パラメータ名:chars
   System.Text.Encoding.ThrowCharsOverflow()で
   System.Text.Encoding.ThrowCharsOverflow(DecoderNLSデコーダー、ブール値nothin
gDecoded)
   System.Text.UTF8Encoding.GetChars(Byte * bytes、Int32 byteCount、Char * char
s、Int32 charCount、DecoderNLS baseDecoder)
   System.Text.DecoderNLS.GetChars(Byte * bytes、Int32 byteCount、Char * chars、
 Int32 charCount、ブールフラッシュ)
   System.Text.DecoderNLS.GetChars(Byte [] bytes、Int32 byteIndex、Int32byteCで
ount、Char [] chars、Int32 charIndex、ブール値フラッシュ)
   System.Text.DecoderNLS.GetChars(Byte [] bytes、Int32 byteIndex、Int32byteCで
ount、Char [] chars、Int32 charIndex)
   System.IO.BinaryReader.InternalReadOneChar()で
   System.IO.BinaryReader.PeekChar()で

したがって、PeekCharはそれを行うための最良の方法ではないかもしれません。また、リーダーの現在の位置をチェックしていて、次のキャラクターが実際にどうあるべきかをチェックしているので、そのように使用するべきではないと思います。

4

5 に答える 5

101

バイナリ データを操作するときに EOF を確認するより正確な方法があります。アプローチに伴うエンコーディングの問題をすべて回避し、PeekChar必要なことを正確に実行します。つまり、リーダーの位置がファイルの末尾にあるかどうかを確認します。

while (inFile.BaseStream.Position != inFile.BaseStream.Length)
{
   ...
}
于 2013-08-06T15:12:37.217 に答える
5

不足している EOF メソッドを追加してBinaryReaderクラスを拡張するカスタム拡張メソッドにラップします。

public static class StreamEOF {

    public static bool EOF( this BinaryReader binaryReader ) {
        var bs = binaryReader.BaseStream;
        return ( bs.Position == bs.Length);
    }
}

したがって、次のように書くことができます。

while (!infile.EOF()) {
   // Read....
}

:) ... infileを次のような場所に作成したと仮定します。

var infile= new BinaryReader();

注: varは暗黙の型指定です。これは、C# で適切にスタイル設定されたコードのパズルのピースの 1 つです。:D

于 2015-10-22T03:00:03.217 に答える