10

ファイルを再度開かずに、ファイルの「ポインタ」を最初にリセットするにはどうすればよいですか?(fseekCのようなもの?)

たとえば、次の2つのパターンでgrepしたいファイルがあります。

f=open('test') => #<File:test> 
f.grep(/llo/)  => ["Hello world\n"] 
f.grep(/wo/)   => [] 

fファイルを再度開かずにリセットすることはできますか?

注:回避策は探していません。私は自分でいくつか考えることができます;)。

4

2 に答える 2

18

巻き戻しを使用する

iosを入力の先頭に配置し、linenoをゼロにリセットします。

f = File.new("testfile") 
f.readline   #=> "This is line one\n"
f.rewind     #=> 0 
f.lineno     #=> 0 
f.readline   #=> "This is line one\n"
于 2012-10-16T15:36:19.297 に答える
5

IOクラスのrubyドキュメントを見てください。ストリームをリセットするには:

f.pos = 0

また

f.seek 0

これらのメソッドを使用してストリームを任意のバイト位置に設定することもできますが、ファイルにマルチバイト文字が含まれている場合は注意してください。

ヒント:File.ancestors継承チェーンがわかるので、必要なことを達成できる可能性のあるメソッドを検索できます(ただし、シングルトンメソッドとの場合はより高度なリフレクションを実行する必要がある場合がありますmethod_missing)。

アップデート:

rewindメガの答えもリセットされるので、よりクリーンになる可能性がありますlinenogrepの出力はの値の影響を受けませんがlinenolinenoリセットしない限り、ますます不正確になります。気にしない場合はlineno、どちらのソリューションも安全に使用できます。

于 2012-10-16T15:38:52.090 に答える