3

私はRubyを学んでいて、現在ファイルの読み書きをいじっています。ファイル「filename」を作成すると、.write() メソッドで書き込むことができます。ただし、 .read() を実行した後に再度開かないと、コンテンツを端末に出力できません (8 行目: を参照puts write_txt.read())。行 8 を複数回実行しようとしましたが、空白行が出力されるだけです。8 行目がない場合は、puts txt.read()単純に空白行を出力します。次のコードは、8行目なしでも機能しますputs(単純にwrite_txt.read()

# Unpacks first argument to 'filename'
filename = ARGV.first

# Lets write try writing to a file
write_txt = File.new(filename, 'w+')
write_txt.write("OMG I wrote this file!\nHow cool is that?")
# This outputs a blank line THIS IS THE LINE IN QUESTION
puts write_txt.read()

txt = File.open(filename)
# This actually outputs the text that I wrote
puts txt.read()

なぜこれが必要なのですか?明らかに書き込まれたファイルが、少なくとも 1 回空白として読み取られた後、再び開かれるまで空白として読み取られるのはなぜですか?

4

2 に答える 2

5

ファイルを読み書きするとき、ファイル内の現在の位置を追跡する「カーソル」と呼ばれる内部ポインターがあります。ファイルを書き込むとき、カーソルは書き込んだ最後のバイトの後のポイントに設定されるため、追加の書き込みを実行すると、(その上ではなく) 前回の書き込みの後に発生します。読み取りを実行すると、現在の位置からファイルの最後まで読み取られますが、ファイルには何も含まれていません。

ファイルを開いて (カーソル位置 0)、文字列 "Hello" を書き込んで (カーソル位置 6)、カーソルから読み込もうとすると、Ruby は「おや、このファイルにはカーソル位置より後のコンテンツはありません」と言います。 6" であり、単に空の文字列を返します。

でファイル カーソルを巻き戻し、カーソルをIO#rewindファイルの先頭にリセットできます。その後、通常どおりファイルを読み取ることができます (カーソルからファイルの最後まで読み取ります)。

巻き戻し後に書き込みを行うと、以前に書き込んだ内容が上書きされることに注意してください。

# Unpacks first argument to 'filename'
filename = ARGV.first

# Lets write try writing to a file
write_txt = File.new(filename, 'w+')
write_txt.write("OMG I wrote this file!\nHow cool is that?")

write_txt.rewind
puts write_txt.read()

ただし、一般に、同じファイルハンドルからの読み取りと書き込みの両方を行うことは、悪い習慣と見なされていることに注意してください。通常、1 つのファイル ハンドルを読み取り用に、もう 1 つを書き込み用に開きます。この 2 つを混在させると、厄介な結果が生じる可能性があります (たとえば、読み取りのためにカーソルを巻き戻し、次に書き込みを実行することで既存のコンテンツを誤って上書きしてしまう!)。

于 2012-12-28T02:03:41.787 に答える
0

出力は必ずしもすぐにファイルに書き込まれるわけではありません。また、ポインターはファイルの最後にあります。読み取り/書き込みモードで読み取りたい場合は、リセットする必要があります。close読むためにもう一度開きたい場合は、簡単にできます。試す:

write_txt.write("OMG I wrote this file!\nHow cool is that?")
# This outputs a blank line THIS IS THE LINE IN QUESTION
write_txt.close
txt = File.open(filename)
puts txt.read()
于 2012-12-28T01:57:23.837 に答える