著作一覧 |
ruinedの編集モードを作っていて不思議現象にぶつかった。
気付くと改行が増えていくのだ。
元々、OSXやLinuxで編集したソースなら改行は\nだけ、Windowsでメモ帳で作ったソースなら改行は\r\n、でも他のエディタで作れば\nだけ、という状態を保持したいわけだが、途中でHTMLのtextareaに入れるから、そこをうまいこと復元させようと考えていたのであった。
で、次のことに気付く。
File.open('foo', 'w') do |f| f.write "abc\r\ndef\r\n" end
とすると、書かれたファイルはabc\r\r\ndef\r\r\nとなって\rが増える。
てっきり\r\nであれば、つまり\rに続けて\nがあれば余計な\nはつかないというような制御をしていると思っていたのでこれは驚いた。
が、そうではなく、\nを見ると自動的に\r\nを出力するのがテキストモードの仕様なのだった。
まさかと思ってCで試してみる(msvcr100)。
#include <stdio.h> char* data = "abc\r\ndef\r\nghi\r\n"; int main(int argc, char* argv[]) { FILE* p = fopen("crlf.txt", "w"); fwrite(data, strlen(data), 1, p); fclose(p); return 0; }
うむ、確かにabc\r\r\n... となる。
結論:
テキストモードを使う場合は、明示的な\rを出力バッファへ含めてはならない。あるいは、\rを意識するのであればバイナリモードを利用する。
そういえば、昨日はつい怒りにまかせて改行を1文字であるかのように書いたが、正しくは、復帰で行の先頭に戻り、改行で行送りをするのだから、\r\nの復帰改行2文字が正しく、\nだけだと80カラム端末ならたまたま80カラム出力した後であれば同一行でくるりとカラム0にカーソルが進み、そこで改行コードで直下に落ちるのでうまくいくだけなのだった。
が、コンピュータはタイプライターではないのだから、そういうことはどうでも良いのだった。でもたまには復帰の意味を思い出してやるのだった。
そのへんについてはレイモンドチェンが書いている。
Windowsプログラミングの極意 歴史から学ぶ実践的Windowsプログラミング!(Raymond Chen)ジェズイットを見習え |