アプリ版:「スタンプのみでお礼する」機能のリリースについて

2行読み込んで一行戻り、また2行読み込む

はじめまして、現在、「2行読み込み、一行戻り、また2行読み込む」処理のものを作成しています。
具体的には、
A
B
C
D
E
と5行に渡り記述されたファイルを上記の旨で表示させる場合、
A
B
B
C
C
D
D
E
としたいのですが、

filename = ARGV[0]
ABCDE = []
file = open(filename)
while f = file.gets do
 f.chomp!
  g = file.gets
  g.chomp!
 p f
 p g
end
file.close

とすると出力は

"A"
"B"
"C"
"D"
abcde.rb:9: private method `chomp!' called for nil:NilClass (NoMethodError)

もちろん2行読み込んで、そのまま次の2行を読み込む記述のため上記のようになってしまいます。

まとめますと、
「一行戻るための記述がわからないので、それを実現するための記述を教えてほしい」
ということです。
rewindを使うと先頭まで戻ってしまうのでどうしたらいいのかさっぱりです。

わかりづらくて非常に申し訳ない、初歩的であろう質問ですがよろしくお願いします。
rubyは1.8.6を使っています。

A 回答 (1件)

逆にお聞きします。


1行「戻らないと」ダメなのですか?
例えば

f = nil
while g = file.gets do
 g.chomp!
 unless f.nil? then
  p f
  p g
 end
 f=g
end

と、前の行を変数に取っておく、という方法もあります。

どうしても戻るのなら、2行目を読む前にtell / posで場所を覚えてseek / posで移動するというのはありますが、何度もファイルを行き来して読むのは効率はよくないです。

file_position=0
while f = file.gets do
 f.chomp!
file_positon = file.pos
g = file.gets
# ここでg==nil(→ファイルがfを読んだところで終り)のチェックが無いので
# 次のchompで
# abcde.rb:9: private method `chomp!' called for nil:NilClass (NoMethodError)
#のエラーになってます
g.chomp!
 p f
 p g

file.pos = file_positon
end
    • good
    • 0
この回答へのお礼

返信ありがとうございます。
変数でとっておくということも考えましたが、おっしゃるようにどうしても戻る必要がありました。
.pos
.seek(i)
というのがあったのですね。

エラーですが
if g == nil then
break
を付けて直しました。

ありがとうございました。

お礼日時:2010/10/08 14:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!