Ruby 如何查找文件中当前位置的负数?

Ruby 如何查找文件中当前位置的负数?,ruby,file,Ruby,File,我试图从ruby中的当前位置向后搜索2个字节。下面的代码尝试查找行的前一个结尾 1.9.3-p448 :003 > while file.getc != '\n' 1.9.3-p448 :004?> file.seek(-2,IO::SEEK_CUR) 1.9.3-p448 :005?> end Errno::EINVAL: Invalid argument - test from (irb):4:in `seek' fr

我试图从ruby中的当前位置向后搜索2个字节。下面的代码尝试查找行的前一个结尾

    1.9.3-p448 :003 > while file.getc != '\n'
    1.9.3-p448 :004?>   file.seek(-2,IO::SEEK_CUR)
    1.9.3-p448 :005?>   end
    Errno::EINVAL: Invalid argument - test
    from (irb):4:in `seek'
    from (irb):4
    from /usr/local/rvm/rubies/ruby-1.9.3-p448/bin/irb:16:in `<main>'
1.9.3-p448:003>而file.getc!='\不
1.9.3-p448:004?>file.seek(-2,IO::seek\u CUR)
1.9.3-p448:005?>结束
错误号::EINVAL:参数无效-测试
from(irb):4:in'seek'
来自(irb):4
from/usr/local/rvm/rubies/ruby-1.9.3-p448/bin/irb:16:in`'
我无法理解为什么会出现这个错误。它寻求完全的外部循环(相同的语句)。
test是文件名。

我猜您的问题是文件中还没有两个字节。我只是用一个简单的文本文件:

>> fp = File.new('pancakes.txt', 'r')
>> fp.readline
>> fp.seek(-2, IO::SEEK_CUR)
=> 0
>> fp.seek(-20, IO::SEEK_CUR)
Errno::EINVAL: Invalid argument - x.txt
文件的第一行只有几个字符长,因此
-20
会尝试将我放在文件开头之前


我认为您只需要在组合中加入一个检查:如果
file.pos==0
,则您处于开始位置,负搜索将引发异常。

您的文件中有什么?启动循环时,
file.pos
是什么?这是循环file.seek(-2,IO::seek\u END)之前的语句,那么?为什么会发生这种情况?我不知道,异常之前的
file.pos
是什么?档案有多大?它有新行吗?我很好奇为什么你要用
getc
来读取文本文件?与依赖
getc
、磁盘上的字符匹配和文件定位相比,读取行并在最后几行读取的内存中保留一个小的缓冲区,并在该缓冲区中向前/向后移动,将更容易、更快。您的代码示例有一种非常类似于“C”的味道,这不是我们通常在Ruby中进行文件I/O的方式,除了非常特殊(罕见)的情况。