C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

FIleStreamの使い方について /七味 (18/05/11(Fri) 22:40) #87331
Re[1]: FIleStreamの使い方について /Azulean (18/05/11(Fri) 23:33) #87332
  └ Re[2]: FIleStreamの使い方について /七味 (18/05/12(Sat) 08:08) #87333 解決済み


親記事 / ▼[ 87332 ]
■87331 / 親階層)  FIleStreamの使い方について
□投稿者/ 七味 (1回)-(2018/05/11(Fri) 22:40:09)

分類:[C#] 

初めまして
C#初心者です。

開発環境はVS Community 2017です。

1ギガ以上の1行でつながったファイルがあり、それを特定のバイト数で読みたいと思い、
このようなプログラムを書きました。

    private void button1_Click(object sender, EventArgs e)
    {

        // ファイルオープン
        FileStream fs = new FileStream(@"C:\bigdata", FileMode.Open, FileAccess.Read);

        // 書き込み用ファイルオープン
        StreamWriter sw = new StreamWriter(@"C:\newdata.txt", false, Encoding.GetEncoding("shift_jis"));

        byte[] buf = new byte[1000];
        int bufpos = 0;
        for(;;)
        {
            int readSize = fs.Read(buf, bufpos, buf.Length);
            if(readSize == 0)
            {
                break;
            }
            bufpos += 1000;
            string text = System.Text.Encoding.GetEncoding("SHIFT-JIS").GetString(buf);
            string val = text.Substring(10, 10);
            sw.WriteLine(val);
        }
        // ファイルクローズ
        fs.Close();
        sw.Close();
    }
}


1回目のループでは問題ありませんが、2回目のfs.Readで以下のエラーがでます。

「例外はハンドルされていません。」




どのように修正すればよろしいでしょうか?
よろしくお願いします。

[ □ Tree ] 返信 編集キー/

▲[ 87331 ] / ▼[ 87333 ]
■87332 / 1階層)  Re[1]: FIleStreamの使い方について
□投稿者/ Azulean (950回)-(2018/05/11(Fri) 23:33:49)
No87331 (七味 さん) に返信
> int readSize = fs.Read(buf, bufpos, buf.Length);

Read の第2引数は、第1引数のどの位置に読み取った結果を設定するかを指定するものです。
bufpos はループ内で加算されてしまっているので、2回目のループでは配列の範囲外の位置を指定してしまっています。

このコードでは、本来 0 固定ではないですか?
(ファイル内の位置を指定する引数ではありません。Stream は Read を呼ぶ度に位置が変わっていく(進んでいく)考え方になっています)
[ 親 87331 / □ Tree ] 返信 編集キー/

▲[ 87332 ] / 返信無し
■87333 / 2階層)  Re[2]: FIleStreamの使い方について
□投稿者/ 七味 (2回)-(2018/05/12(Sat) 08:08:55)
No87332 (Azulean さん) に返信
> ■No87331 (七味 さん) に返信
>>int readSize = fs.Read(buf, bufpos, buf.Length);
>
> Read の第2引数は、第1引数のどの位置に読み取った結果を設定するかを指定するものです。
> bufpos はループ内で加算されてしまっているので、2回目のループでは配列の範囲外の位置を指定してしまっています。
>
> このコードでは、本来 0 固定ではないですか?
> (ファイル内の位置を指定する引数ではありません。Stream は Read を呼ぶ度に位置が変わっていく(進んでいく)考え方になっています)


Azulean さん

ありがとうございました。
第2引数(bupos)を0に固定すると2回目以降のループでもエラーにならず処理が進みました。
ありがとうございました。


解決済み
[ 親 87331 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -