- - PR -
[C#]ストリーム位置を初期位置に戻すには?
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-01-31 21:13
ストリームの読み込みにあたって、ReadToEndメソッドを続けて使用したいのですが、どうしても2度目のReadToEndで返される値が空の文字列 ("") になってしまいます。ストリーム位置を2度目のReadToEndメソッド前に初期位置に戻すにはどうしたらいいのでしょうか?
| ||||||||
|
投稿日時: 2006-01-31 21:15
BaseStream.Seek(0, SeekOrigin.Begin); _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-01-31 21:34
「じゃんぬねっと」さん、早い返信ありがとうございます。
上記の方法でやってみたのですが「このストリームはシーク操作をサポートしません。」というエラーが出てしまいました。 GetResponseStreamメソッドにてインターネットリソースから取得したストリームデータなので、別の方法を試みないといけないのでしょうか? | ||||||||
|
投稿日時: 2006-02-01 01:51
StreamReader のコンストラクタで Stream を渡しているんですよね? ダメならば、新しいインスタンスを生成しなおすことになるのかな。 そもそも、同じ StreamReader に対して 2 回 ReadToEnd メソッドを実行することを意味します。 それって普通にムダじゃないですか? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-02-01 02:14
> GetResponseStreamメソッドにてインターネットリソースから取得したストリームデータなので、別の方法を試みないといけないのでしょうか? だそうなので、まあシークはサポートされてないってことですね。 で、ReadToEndを使ってるって事は別にSteamReaderでなくてもいいって事でしょうから、 単純に文字列を覚えとくんじゃだめなんですかね? 何らかの事情でどうしてもReaderを渡す必要があるとかなら、StringReaderとかを アダプタに使うって手もありますが。 --追記 あるいはByte配列にいったん読み込んでからMemoryStreamとStreamReaderとか? まあ、文字列でいいならそれが一番手っ取り早いと思いますが。 [ メッセージ編集済み 編集者: なちゃ 編集日時 2006-02-01 02:19 ] | ||||||||
|
投稿日時: 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"でエンコードした文字列が取得できるのではないかと考え、質問させていただいたのです。 この動作を実現するためのシンプルな方法というのはあるのでしょうか? | ||||||||
|
投稿日時: 2006-02-01 18:11
全部Byte配列に読み込んでから、Encoding.GetStringでいいんでは?
| ||||||||
|
投稿日時: 2006-02-01 18:19
良くわかりませんが、以下のような感じですか?
最初のエンコードが合っていないと化けますが。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |
1