2

ハフマン解凍を書き込もうとしています。圧縮ファイル全体をバイト単位で読み取ろうとする関数がありますが、最初の150バイト程度しか読み取れず、残りがスキップされるという問題があります。理由がわかりません。

関数は次のとおりです。

public static StringBuilder odczytBajtowy(string nazwa)
    {
        FileStream plik = null;
        StringBuilder dane = new StringBuilder("");
        try
        {
            plik = new FileStream(@nazwa, FileMode.Open, FileAccess.Read);

            int w;
            int n = 0;
            do
            {
                n++;
                w = plik.ReadByte();

                if (w != -1)
                    dane.Append(StringHelp.Reverse(Convert.ToString((byte)w,2).PadLeft(8, '0')));
            }
            while ((w > 0));
        }
        catch (FileNotFoundException)
        {
            Console.WriteLine("Brak pliku {0}", nazwa);
        }
        finally
        {
            if (plik != null)
            {
                plik.Close();
            }
        }

        return dane;
    }

ファイルが実際に終了する前に、関数がEOFを読み取るように見えます。バイト値のみを書き込んでいるため、バイト間のどこかにEOFがないことはわかっています。

4

4 に答える 4

3

while条件が正しくありません。読み取る必要がwhile (w != -1)あるため、ファイルの終わりではなく、ゼロバイトが見つかるとすぐに読み取りバイトのループを停止します。

于 2012-11-21T16:07:24.613 に答える
2
while ((w > 0));

これは0に達すると停止します。これを次のように変更します

while ((w >= 0));
于 2012-11-21T16:08:25.050 に答える
2

おそらくゼロバイトに到達しています。

whileループを変更して0を含めます。

while ((w >= 0));
于 2012-11-21T16:09:26.930 に答える
1

問題は次の行にあります。

while((w> 0));

そのはず:

while((w!= -1));

ファイルに0が含まれている可能性が高いためです。

于 2012-11-21T16:10:50.667 に答える