2011-03-07 12 views
3

私がやっていることは、入力ストリームのどこにいるのかを覚えておき、後でそこに戻ってしまうことです。 これは、mark()とreset()を使ってjavaで非常に簡単ですが、C#でこれを可能にする方法はわかりません。そのような方法はありません。例えばC#StreamReaderのマーキングに関する質問

public int peek() 
{ 
    try 
    { 
     file.x; //in java file.mark(1) 
     int tmp = file.read(); 
     file.+ //in java file.reset(); 
     return tmp; 
    } 
    catch (IOException ex) {} 
    return 0; 
} 

答えて

5

確かに私の知っていることはありません。しかし、あなたはスタックのようなものを使用して、単純に押し()とポップ(可能性)は、このオフに上がると、あなたのマーカーをダウンさせるために:

FileStream file = new FileStream(...); 

try { 
    Stack<long> markers = new Stack<long>(); 

    markers.Push(file.Position); 

    file.Read(....); 

    file.Seek(markers.Pop(),SeekOrigin.Begin); 
} finally { 
    file.Close(); 
} 

辞書に基づいて、もう一つのアイデア:

FileStream file = new FileStream(...); 

try { 
    Dictionary<string,long> markers = new Dictionary<string,long>(); 

    markers.Add("thebeginning",file.Position); 

    file.Read(....); 

    file.Seek(markers["thebeginning"],SeekOrigin.Begin); 
} finally { 
    file.Close(); 
} 
+1

+1、素敵なソリューションが、私はあなたの意味と仮定しStack-初期化は別のスコープ、つまりクラスレベルにありますか? ;) – Abel

+0

必ずしも、どこで使用したいかによって異なります。ここでは、スタックはファイルI/Oが呼び出すのと同じ範囲にあります。 Stack <>はちょうど1つの解決策でもあります。辞書を使用して、代わりにNAMEDマーカーを付けることができます。それはすべての肉汁です:) – Lloyd

+0

+1、そのような解決策です!また可能:FileStreamをサブクラス化し、そのクラスにそのスタックを追加してください – Sascha

0

それはあなたが使用しているStreamReaderである場合、あなたはそれが正確にStreamそのものではないことを心に留めておく必要がありますが、あなたはそのBaseStreamプロパティにアクセスすることができます

StreamReader reader = new StreamReader("test.txt"); 
Stream stream = reader.BaseStream; 
long pos = stream.Position; 

そして、それはあなたがそこに戻って移動することができます:それは、ストリームであなたの現在の位置を与える

stream.Seek(pos, SeekOrigin.Begin); 
+0

このソリューションも機能します – Strausa