【发布时间】:2023-04-06 00:01:02
【问题描述】:
考虑以下脚本:
f = File.open('1.txt')
puts f.gets
f2 = f.clone
puts f.gets
puts f2.gets || '<empty line>'
1.txt是这样的:
first line
second line
third line
...
当我运行它时,我的输出是:
first line
second line
<empty line>
期望的输出是:
first line
second line
second line
有可能吗?
UPD 事实上,我正在从头到尾读取一个以elif 开头的文件。所以我决定首先找出如何从头到尾读取文件,考虑到我什至找不到这样做的方法。
我有一个日志文件是这样的:
<timestamp> app from <path> restarted with PID <pid>
<timestamp> <pid> <some info>
<timestamp> <pid> <some info>
<timestamp> app from <path> restarted with PID <pid>
<timestamp> <pid> <some info>
<timestamp> <pid> <some info>
日志被多个应用程序使用。我试图过滤掉其中一个人在做什么。应用程序会不时重新启动。所以首先我需要确定最后一个应用程序 pid,然后检查所有行直到它重新启动,确定下一个 pid,等等。
UPD2这是我现在要做的:
#!/usr/bin/env ruby
require 'elif'
f = Elif.open('/home/yuri/_/1.txt')
def f.dup
p self
file = instance_variable_get(:@file)
r = Elif.open file.path
r.instance_variable_get(:@file).seek file.pos
instance_variables.select{ |n| n != :@file }.each{ |n|
p n
r.instance_variable_set n, instance_variable_get(n)
}
p r
r
end
p f.gets
f2 = f.dup
p f.gets
p f2.gets
但输出出人意料如下:
"fourth line\n"
#<Elif:0x007f7842b1fa28 @file=#<File:/home/yuri/_/1.txt>, @current_pos=0, @read_size=1024, @line_buffer=["1\n", "2\n", "3\n"]>
:@current_pos
:@read_size
:@line_buffer
#<Elif:0x007f7842b1f1b8 @file=#<File:/home/yuri/_/1.txt>, @current_pos=0, @read_size=1024, @line_buffer=["1\n", "2\n", "3\n"]>
"third line\n"
"second line\n"
有人能解释一下吗? @files 是否都连接到同一个文件描述符?
UPD3 但是它在开始到结束的方向上工作:
#!/usr/bin/env ruby
f = File.open('/home/yuri/_/1.txt')
def f.dup
r = File.open path
r.seek pos
r
end
p f.gets
f2 = f.dup
p f.gets
p f2.gets
输出:
"1\n"
"2\n"
"2\n"
【问题讨论】:
-
这当然是可能的,但不是通过克隆只是包装流的 File 对象。这里的具体要求是什么?
-
看不懂
f2的意思,就是简单的复制文件句柄,没有变化。你的意思是像puts (f2 = gets)这样的东西吗? -
@Cary Swoveland 那是我尝试使用相同的非空偏移量创建第二个
File实例。