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

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

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

Re[2]: FIleStreamの使い方について


(過去ログ 150 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■87331 / inTopicNo.1)  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で以下のエラーがでます。

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




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

引用返信 編集キー/
■87332 / inTopicNo.2)  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 を呼ぶ度に位置が変わっていく(進んでいく)考え方になっています)
引用返信 編集キー/
■87333 / inTopicNo.3)  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回目以降のループでもエラーにならず処理が進みました。
ありがとうございました。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -