LinuxやCygwinでは問題ないものの、Win32版のRubyでファイルの書き出しを行うと、改行コードがCR+LFになってしまうという問題でちょっとはまってしまったので忘れないようにメモ。
結論としては、ファイルをテキストモードとして開いていたのが原因でした。
たとえば、下記のようなコードを実行するとLinuxでは改行がLF(\n)になるのに対して、Win32ではCR+LF(\r\n)になります。
Win32の実行結果をodした結果
Linuxの実行結果をodした結果
† そういえばずっと昔、Perlでもはまったような気がする・・・・
どう考えてもファイルの書き込み時に\n → \r\nの変換が自動的に行われているようにしか見えないことと、WindowsとLinuxのプラットフォーム的な違いによって発生している(としか思えない)ことから、よくよく考えてみるとWindowsにはファイルにテキストモードとバイナリモードがあることを思い出しました。大昔、Windows上でPerlを動かしたときにもはまった記憶がありますが、すっかり忘れてしまっていました。
ということで、プログラムを以下のように書き換えると無事Win32でも改行がLFのファイルを書き出すことができました。
Rubyのリファレンスではこれくらいしか触れられていないので、もうちょっと解説しておいてくれるといいんですけどね。
組み込み関数 - Rubyリファレンスマニュアル
これらのいずれに対しても "b" フラグを("r+b"のように)つけることができます(整数なら File::BINARY)。この場合、バイナリモードでオープンします(ただし、システムがテキスト/バイナリでファイルを区別する場合に限ります)
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/2935
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。