0

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>'

なぜこのエラーが発生するのか理解できません。ループの外側を完全に探します (同じステートメント)。test はファイル名です。

4

1 に答える 1

0

あなたの問題は、まだファイルに2バイト入っていないことだと思います。私は単純なテキストファイルでこれを行いました:

>> 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、ファイルの先頭の前に配置しようとしました。

posミックスにチェックを入れる必要があるだけだと思いますfile.pos == 0。そうすると、最初にいて、負のシークで例外が発生します。

于 2013-07-30T23:13:42.097 に答える