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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.87331 の関連記事表示

<< 0 >>
■87331  FIleStreamの使い方について
□投稿者/ 七味 -(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で以下のエラーがでます。

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




    どのように修正すればよろしいでしょうか?
    よろしくお願いします。
親記事 /過去ログ150より / 関連記事表示
削除チェック/

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

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

    このコードでは、本来 0 固定ではないですか?
    (ファイル内の位置を指定する引数ではありません。Stream は Read を呼ぶ度に位置が変わっていく(進んでいく)考え方になっています)
記事No.87331 のレス /過去ログ150より / 関連記事表示
削除チェック/

■87333  Re[2]: FIleStreamの使い方について
□投稿者/ 七味 -(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回目以降のループでもエラーにならず処理が進みました。
    ありがとうございました。

記事No.87331 のレス / END /過去ログ150より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -