【COBOL 書き1-9-10】CRLF?CR?ズレるのはカツラだけじゃない

🧩今日の学び
・改行コードは環境によって異なり、LFは1バイト、CRLFは2バイトとして固定長データの位置ズレを起こす
・MacでもVSCodeなどのエディタ設定次第でCRLFになるため、「自分のOSなら安心」とは限らない
・COBOLは文字だけでなく、環境込みのバイト構造としてファイルを扱う必要がある

💻 ターミナル出力 実行結果
2025-12-31
hoshiimo            
02500
kokomade

2026-01-
01gyudon2           
  009   ←ここ
kokomade

なるお)…あれ?改行は1バイトなら、1文字のズレなんじゃないんですか?

ここの「■■009」二つスペースはいってたりしてますけど?

改行は「1バイト」とは限らない

係長)改行は改行でいろいろあるんだよ。

な)はぁ?また得意の欺きですか!?

係)得意ってなんだよ!

な)だって欺き好きでしょ?お見合いで「ご趣味は?」って聞かれて「欺きを少々」でしょ?

係)どんな見合いだよ!

いいか、改行はお前が思ってるほど、簡単な話じゃないんだ。

そこをきちんと理解していないと、今回のように泣きを見るぞ。浅はかなお前ならなおさらだ。

な)浅はかじゃないっすよ!軽薄なだけですよ!

係)そんな違いはどうでもいいわ!

改行には「行送り」と「先頭復帰」がある

係)いいか、改行には、「行を変える」ということと「行の先頭へ戻る」という二つの動作が必要だった。

な)は??

係)タイプライターを考えてみろ。

行送りして、印字のヘッドを先頭に戻す動作をするだろ?

な)知らんすけど…

係)知っとけよ!

な)だから理不尽!

そら係長の時代は、ギッコンバッタンギッチンバッチンしてたんでしょうけどー

係)俺の時代でもタイプライターはないっての。

な)え!また欺き!?

係)なんでそうなるんだよ!

いいから、そういう動きをしてるってことだ。

それぞれ、LF(Line Feed)とCR(Carriage Return)というんだよ。

それぞれの動作だけでは次の行を先頭から文字を入力することができないから、この両方の動作が必要だって話だ。

な)ほー

WindowsはCRLF、Mac/LinuxはLF

係)Windowsはその名残をそのまま残したので、CRLFという二つのコードで改行となっている。

LinuxやMacはLFだけで成立するから一つのコードで改行となる。

な)ほー

係)今回お前はCRLFで改行しているから、2バイトのズレを起こしたってわけだ。

な)ほー

係)わかったのか?

な)いや全然?

係)お前なぁ!

なぜ「CRLF」の順番なのか

な)いや、係長の雑学王っぷりはどうでもいいんですけど、なんでCRLFの順番なんです?

係)ん?

な)行送りしてから、ヘッドを先頭に戻すってなんか逆なような気がして

係)ほー、なんも考えていなかったわけじゃなかったのか。

な)だから、オレだって考えてますからね!

はちみつたっぷりのパンケーキかメープルシロップたっぷりのパンケーキとどっちがいいかしら、っていう困難事例に常に挑戦してますから!

係)………どうでもいいわ!

理由はだ、

①重い印字ヘッドを端から端までガチャンと戻すにはCR(復帰)は時間がかかること。

②通信回線で「LF CR」の順にデータを送ると、ヘッドが左端に戻りきる(CR)前に次の行の文字データが届いてしまい、戻りながら文字を打って文字が重なってしまう問題が起きたこと。

③そこで、時間がかかる「CR」を先に命令し、移動している時間(数ミリ秒)の間に「LF」の命令を処理させることで、時間を稼ぎ、次の行の頭文字が正しく印刷できるように工夫された

ってところだ。

な)えー、なんか普通

係)普通でもないだろ…。

な)で、だからなんなんです?

係)WindowsとMacでは環境が違い、改行コードが違うことがあるから、環境によってバイトがずれることになりうるってことだ。

な)相変わらず、めんどくさいっすね…

あれ?でも今回Macでやったんだから、LFで1文字ズレのはずじゃ?

係)そこも環境の問題だ。

な)え、Mac使ってると思ったら、Windowsだったとか!?

オシャレだと思ってたらオシャレじゃなかった!?スタバでドヤ顔してたら、辱めを受けてたの!?

係)どういうことだよ!

VSCodeは改行コードを切り替えられる

今お前にコードを書かせているのはVSCodeというエディタだ。そのエディタでは、改行の形式を選択できるんだよ。

お前はCRLFのままやってたから、2バイトズレたってだけのはなしだ。

つまりこういうことだ。

💡 ポイント
固定長ファイル(35バイト/レコード):
[SALE-DATE(10)][ITEM-NAME(20)][AMOUNT(5)] + [改行コード(1 or 2)]

CRLFの場合(Windows):
[SALE-DATE(10)][ITEM-NAME(20)][AMOUNT(5)] + [CR(1)][LF(1)] = 37バイト

LFの場合(Linux/Mac):
[SALE-DATE(10)][ITEM-NAME(20)][AMOUNT(5)] + [LF(1)] = 36バイト

ちなみに、VSCodeの右下にある改行の形式をクリックすると選択できるぞ。

な)えー何回欺けば気が済むんですか!?

係)だから欺いてないだろ!

な)ほんと手癖悪いんですから!

係)どういうことだよ!

な)精米所の床に落ちてる米かき集めちゃいけないんすよ!

係)誰がやるかよ!!

つまり、環境依存性を理解しておくことが重要なんだ。

例えば、Windowsで作ったファイルをLinuxで読み込むと、改行コードの違いでズレが生じる。

だから、ファイルを扱う際には、環境を確認するのが基本だ。

自分のいつもの環境が全てじゃないってことを覚えておけ。

おむすび

な)あーい

ズレると大変なことになっちゃうんすね

係)そうだな。

な)カツラもずれると大変ですもんね

係)………

な)専務もたまに大変なことになってますもんね!

係)知らん!俺は知らん!!

係長のワンポイント

改行は「1文字」ではなく、環境ごとに違う制御コードだ。
よくある誤解は「MacならLFだから安心」だが、実際はエディタ設定でCRLFにもなる。
固定長はバイト単位で読むため、改行コードが1→2バイトになるだけで位置がズレる。
その結果、2件目以降のデータが崩壊し、原因不明のバグに見える。
だから重要なのは「コードを書くこと」ではなく、「どの環境で作られたファイルか」を確認することだ。
COBOLは文字を読む言語ではなく、“環境込みのバイト構造”を扱う言語だ。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

CAPTCHA