如何重置文件的"指针"而不重新打开它?(像fseekC中的东西?)
例如,我有一个文件,我想grep两个模式:
f=open('test') => #<File:test>
f.grep(/llo/) => ["Hello world\n"]
f.grep(/wo/) => []
Run Code Online (Sandbox Code Playgroud)
是否可以在f不重新打开文件的情况下重置?
注意:我不是在寻找解决方法; 我可以自己思考一些;).
meg*_*gas 16
使用倒带
将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"
Run Code Online (Sandbox Code Playgroud)
查看该IO课程的 ruby 文档。重置流:
f.pos = 0
Run Code Online (Sandbox Code Playgroud)
或者
f.seek 0
Run Code Online (Sandbox Code Playgroud)
请注意,您还可以使用这些方法将流设置为任意字节位置,但如果文件包含多字节字符,请小心。
提示:File.ancestors将告诉您继承链,以便您可以查找可能实现您想要的功能的方法(但有时您必须对单例方法进行更高级的反射method_missing)。
更新:
megas 的答案可能更干净,因为rewind也会重置lineno. grep的输出不受 值的影响lineno,但lineno除非重置,否则会变得越来越不准确。如果您不关心lineno,您可以安全地使用我们的任一解决方案。