10

如何在不重新打开文件的情况下将文件的“指针”重置为其开头?(类似于fseekC 语言?)

例如,我有一个文件,我想用 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)。

更新:

megas 的答案可能更干净,因为rewind也重置了linenogrep的输出不受 的值的影响lineno,但lineno会变得越来越不准确,除非它被重置。如果您不关心lineno,您可以安全地使用我们的任一解决方案。

于 2012-10-16T15:38:52.090 回答