2017-04-02 2 views
2

ScalaクラスBufferedSourceについて2つの質問があります。scala BufferedSource Position

現在の読み取り位置をクエリするにはどうすればよいですか?

私はposでそれを試してみました:

object testapp extends App { 

val doc = scala.io.Source.fromFile("text.txt") 

println(doc.pos) 
doc.next() 
println(doc.pos) 
doc.next() 
println(doc.pos) 
} 

出力:

0 
2049 
2050 

を、それが0から2049にジャンプするのはなぜ?!

位置をクエリしたり、別の場所に設定する別の方法はありますか?

next()によって返された最後の文字の

答えて

1

pos戻り位置:-)あなたの助けのおかげで、しかしトリックがその位置では、単一のIntegerとして位置のエンコーダ(scala.io.Position)によってコードの行と列の組み合わせです:

オブジェクト位置は、* line と列番号を単一の整数でエンコードする便利な方法を提供します。符号化された行 (列)番号は0からLINE_MASKCOLUMN_MASK)の範囲*、* 0は行(列)が未定義であり、* 1 は、最初の行(列)を表すことを示し ...

https://github.com/scala/scala/blob/v2.11.8/src/library/scala/io/Position.scalaより読みやすい情報を取得するために

http://www.scala-lang.org/api/2.11.8/#scala.io.Source $ RelaxedPosition $

は使用Postioner

現在の入力と位置だけでなく、次の文字メソッド がポジショナーに委譲されます。

例:

val doc = scala.io.Source.fromFile("aaa.txt") 
val positioner = new doc.Positioner() 
val positioned = doc.withPositioning(positioner) 
positioned.next() 
scala> positioner.cline -> positioner.ccol 
res15: (Int, Int) = (1,2) 
positioned.next() 
scala> positioner.cline -> positioner.ccol 
res17: (Int, Int) = (1,3) 

P.S. Sourceは、文字のストリームとしてデータを読み込むことを目的としていますので、getLines()などの便利さを提供します。そのため、基本的にPositionerは絶対位置ではなく行と列で動作します。

あなたはあなたのすべての文字の絶対位置を返すIteratorが必要な場合は、zipWithIndexを使用します。

scala> val doc = scala.io.Source.fromFile("aaa.txt").zipWithIndex 
doc: Iterator[(Char, Int)] = non-empty iterator 

scala> doc.next() 
res38: (Char, Int) = (a,0) 

scala> doc.next() 
res39: (Char, Int) = (a,1) 

scala> doc.next() 
res40: (Char, Int) = (a,2) 

scala> doc.next() 
res41: (Char, Int) = (a,3) 

scala> doc.next() 
res42: (Char, Int) = 
(
,4)