0

ファイルサイズが重要な場合は、何かをする必要があります。これは奇妙な結果を生み出しています

filename = "testThis.txt"
total_chars = 0
file = File.new(filename, "r")
file_for_writing = nil
while (line = file.gets)
  total_chars += line.length
end
puts "original size #{File.size(filename)}"
puts "Totals #{total_chars}"

このような

original size 20121
Totals 20061

なぜ2番目のものが不足しているのですか?

編集:回答者の勘は正しいです:テストファイルには60行が含まれています。この行を変更すると

  total_chars += line.length + 1

それは完璧に動作します。しかし、* nixでは、この変更は間違っているでしょうか?

編集:フォローアップはここにあります。ありがとう!

4

3 に答える 3

5

ファイルには、行を示す特殊文字が格納されています。

  • Windows /DOSおよびのCRLF(0x0D 0x0A)(\ r \ n)
  • UNIXシステムでは0x0A(\ n)。

RubygetsはUNIXメソッドを使用しています。したがって、Windowsファイルを読み取ると、\ r \nバイトが\nに変換されるため、読み取る行ごとに1バイトが失われます。

またString.length、文字列のサイズ(バイト単位)の適切な測定値ではありません。文字列がASCIIでない場合、1文字は複数のバイト(Unicode)で表される場合があります。つまり、バイト数ではなく、文字列の文字数を返します。

ファイルのサイズを取得するには、を使用しますFile.size(file_name)

于 2009-03-09T10:47:00.733 に答える
3

私の推測では、あなたはWindowsを使用しており、「testThis.txt」ファイルの行末は\ r\nです。ファイルをテキストモードで開くと、末尾の各行が\n単一の文字に変換されます。したがって、1行あたり1文字が失われます。

テストファイルには60行ありますか?それはこの説明と一致するでしょう。

于 2009-03-09T10:43:57.153 に答える
3

ここでは、行末の問題が原因である可能性が最も高いです。

また、テキストファイルの文字エンコードがASCII以外の場合、2つの間に不一致があることにも注意してください。ファイルがUTF-8の場合、これは、標準のASCIIアルファベット記号のみを使用する英語および一部のヨーロッパ言語で機能します。それを超えると、ファイルサイズと文字数は大きく異なる可能性があります(文字数と比較してファイルサイズの最大4倍または6倍)。

「1文字=1バイト」に依存することは、ある時点でほぼ確実に失敗するため、問題を引き起こしているだけです。

于 2009-03-09T10:54:56.517 に答える