2009-05-06 3 views
21

StringReaderインスタンス(クリップボードからの読み取り)またはStreamReaderインスタンス(ファイルからの読み取り)のいずれかを取り、どちらか一方をTextReaderインスタンスとしてキャストする方法があります。C#.NET TextReaderカーソルをどのようにしてスタートポイントに戻しますか?

ソース入力の一部を「先読み」してから、カーソルを最初に戻す必要があります。私は必ずしも元のファイル名を持っているとは限りません。どのように私はこれを行うには?

ありSystem.IO.StreamSeek方法への言及であるが、それはBasestreamプロパティを通じてStreamReaderであるが、これは、TextReaderに実装されていません。しかしStringReaderにはBaseStreamという特性がありません。

答えて

34

これはTextReaderに依存する。それはStreamReaderだ場合は、使用することができます。

sr.BaseStream.Position = 0; 
sr.DiscardBufferedData(); 

TextReaderの(基本的な流れはもちろん、シーク可能であると仮定。)

他の実装はは、「巻き戻し」のという概念を持っていないかもしれませんIEnumerable<T>と同じ方法ではありません。あなたは多くの点でTextReaderを賛美してIEnumerable<char>と考えることができます。それは、一度にデータの全体の塊を読んで、ラインなどを読む方法を持っていますが、基本的には "前方読取り"タイプです。

編集:私はStringReaderが巻き戻しのいずれかの種類をサポートしているとは思いません。可能であれば、元の文字列からStringReaderを作り直す方がよいでしょう。それが実現不可能な場合は、StringReaderのすべての「通常」の呼び出しをプロキシする独自のTextReaderクラスを作成することができますが、必要に応じてそのプロキシインスタンスを再作成します。それはStreamReaderある場合

+1

BaseStreamのおかげで、問題を完全に解決できるように質問を更新しました。 – Brendan

+0

ありがとう、私は過負荷を使用してメソッドに渡されるものを再考する必要がありますように見えます。 – Brendan

+0

私はこの種のリセットを使用する際に問題がありました。そのようなリセットの後に読み込まれる文字列には、おそらくエンコーディングを決定する最初の3つの隠し文字が含まれています。結果的に、ストリームリーダーと "期待される文字列"をリセットして文字列を比較すると、意外にもfalseが返されます。 – sthiers

-3

シークと見つけるでしょう。

Seek(0, SeekOrigin.Begin); 

TextReaderStreamReaderから派生しています。 StreamReaderBaseStreamプロパティを含む。

+1

を行うことができます - 他の方法で回避。 –

+0

ええ、良い点マーク。これはほとんどの人の常識に対するものですが、それは本当です。 – jpierson

10

、およびサポートは、その後、求めているストリーム場合:

 reader.BaseStream.Seek(0, SeekOrigin.Begin); 
     reader.DiscardBufferedData(); 

はしかし、これは任意のTextReaderの上では不可能です。おそらくそれをすべて文字列として読むことができますし、StringReaderを繰り返し使用できますか?

+0

BaseStreamに頭をアップしてくれてありがとう、おそらく問題が完全に解決できるように質問を更新しました。 – Brendan

+0

テキストリーダーを次のように初期化した場合:TextReader reader = new StreamReader()次に、リーダーを基本クラスにキャストし、シーク後にメソッドを呼び出します。 stream.Seek(offset、SeekOrigin.Begin); (StreamReaderとしてのリーダー).DiscardBufferedData(); – agrath

+0

@agrathこれは、私が任意の* 'TextReader'sについて言った理由です。 –

3

私はあなたのポストに出くわしました、そして、これは不可能であると言われました。ただ完全にStringReaderを避ける:

Stream stream = new MemoryStream((new System.Text.ASCIIEncoding().GetBytes(mystring)), false); 
reader = new StreamReader(stream, new System.Text.ASCIIEncoding()); 

それはきれいではありませんだし、それは(私はとにかく必要なものだった)ASCIIを使用しています私が働く迅速な何かをハッキング。別のエンコーディングでは、n番目の文字と等しくないn番目のバイトを探すので、これはうまくいきません。必要な場合は、

のようにすることができます.UTF32は唯一の固定長のUnicode形式です。

あなたは今、 "たTextReaderは、StreamReaderを由来し、"

reader.BaseStream.Position = wherever; // or wherever * 4 for the UTF32 variety, 
             // in your case, the beginning of the string, 
             // which is always 0 obviously 
reader.DiscardBufferedData(); 
+1

私は" 32 unicode seek c#streamreader "その2番目のスニペットで頭の爪を打つ。 +1 ...私はそれを試しに行くよ! –

+1

今私は、サロゲートペアを混乱させる必要がないように、文字列とStringBuilderの32ビットバージョンが必要です。 (ええと、\ nとWindowsの\ r \ n改行の混同を解析してもそれほど問題はありません。後者はサロゲートペアに似ています) –

+0

ええ、それを楽しんでください;)シークが必要な場合あなたは少し苦しんでいます。それを避けることができれば、それを回避してください。あなたが再び文字列を持っているとすぐに、あなたは健全な土地に戻ってきます。そして代理ペアはあなたのすべての難しさを扱うStringデータ型に残すことができます。あなたがそのIMOで行うことができる最も良いことは、すべての構文解析でそれをスキップ/無視することです。 – Martijn

関連する問題