- PR -

[C#]ストリーム位置を初期位置に戻すには?

1
投稿者投稿内容
Terol
会議室デビュー日: 2005/11/04
投稿数: 15
投稿日時: 2006-01-31 21:13
ストリームの読み込みにあたって、ReadToEndメソッドを続けて使用したいのですが、どうしても2度目のReadToEndで返される値が空の文字列 ("") になってしまいます。ストリーム位置を2度目のReadToEndメソッド前に初期位置に戻すにはどうしたらいいのでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-31 21:15
引用:

Terolさんの書き込み (2006-01-31 21:13) より:

ストリーム位置を2度目のReadToEndメソッド前に初期位置に戻すにはどうしたらいいのでしょうか?


BaseStream.Seek(0, SeekOrigin.Begin);

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Terol
会議室デビュー日: 2005/11/04
投稿数: 15
投稿日時: 2006-01-31 21:34
「じゃんぬねっと」さん、早い返信ありがとうございます。
上記の方法でやってみたのですが「このストリームはシーク操作をサポートしません。」というエラーが出てしまいました。
GetResponseStreamメソッドにてインターネットリソースから取得したストリームデータなので、別の方法を試みないといけないのでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-01 01:51
引用:

Terolさんの書き込み (2006-01-31 21:34) より:

上記の方法でやってみたのですが「このストリームはシーク操作をサポートしません。」というエラーが出てしまいました。
GetResponseStreamメソッドにてインターネットリソースから取得したストリームデータなので、別の方法を試みないといけないのでしょうか?


StreamReader のコンストラクタで Stream を渡しているんですよね?
ダメならば、新しいインスタンスを生成しなおすことになるのかな。

そもそも、同じ StreamReader に対して 2 回 ReadToEnd メソッドを実行することを意味します。
それって普通にムダじゃないですか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2006-02-01 02:14
引用:

じゃんぬねっとさんの書き込み (2006-02-01 01:51) より:
StreamReader のコンストラクタで Stream を渡しているんですよね?
ダメならば、新しいインスタンスを生成しなおすことになるのかな。

そもそも、同じ StreamReader に対して 2 回 ReadToEnd メソッドを実行することを意味します。
それって普通にムダじゃないですか?


> GetResponseStreamメソッドにてインターネットリソースから取得したストリームデータなので、別の方法を試みないといけないのでしょうか?

だそうなので、まあシークはサポートされてないってことですね。
で、ReadToEndを使ってるって事は別にSteamReaderでなくてもいいって事でしょうから、
単純に文字列を覚えとくんじゃだめなんですかね?

何らかの事情でどうしてもReaderを渡す必要があるとかなら、StringReaderとかを
アダプタに使うって手もありますが。

--追記
あるいはByte配列にいったん読み込んでからMemoryStreamとStreamReaderとか?
まあ、文字列でいいならそれが一番手っ取り早いと思いますが。


[ メッセージ編集済み 編集者: なちゃ 編集日時 2006-02-01 02:19 ]
Terol
会議室デビュー日: 2005/11/04
投稿数: 15
投稿日時: 2006-02-01 18:04
「じゃんぬねっと」さん、「なちゃ」さん、的確なアドバイスありがとうございます。なんとか自分が意図した動作をするプログラムは書けました。ですが複雑になりすぎてしまいました。
ReadToEndを連続して使いたかったというのは、

StreamReader reader1 =
  new StreamReader(StreamData,Encoding.GetEncoding("Shift_JIS"));
StreamReader reader2 =
  new StreamReader(StreamData,Encoding.GetEncoding("euc-jp"));
richTextBox1.Text=reader1.ReadToEnd();
richTextBox2.Text=reader2.ReadToEnd();

というような2種類の文字コードで読み込みたかったのです。
しかし、上記のプログラムではどうしてもrichTextBox2の方が、空の文字列 ("")になってしまうので、「ストリーム位置を戻す方法」さえ分かれば、richTextBox2に"euc-jp"でエンコードした文字列が取得できるのではないかと考え、質問させていただいたのです。
この動作を実現するためのシンプルな方法というのはあるのでしょうか?
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2006-02-01 18:11
全部Byte配列に読み込んでから、Encoding.GetStringでいいんでは?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-01 18:19
引用:

Terolさんの書き込み (2006-02-01 18:04) より:

この動作を実現するためのシンプルな方法というのはあるのでしょうか?


良くわかりませんが、以下のような感じですか?

コード:

    private static void MakiMakiLove() {
        // ReadToEnd で読み込まれたものとする
        string stTarget = "ギリギリchop!!";

        // byte の配列にする
        System.Text.Encoding def = System.Text.Encoding.Default;
        byte[] bBytes = def.GetBytes(stTarget);

        // UTF-8 として表示
        System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
        this.textBox1.Text = utf8.GetString(bBytes);

        // Unicode として表示
        System.Text.Encoding uni = System.Text.Encoding.Unicode;
        this.textBox2.Text = uni.GetString(bBytes);
    }


最初のエンコードが合っていないと化けますが。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

スキルアップ/キャリアアップ(JOB@IT)