• ベストアンサー

改行コードの謎

現在、VisualStudioを使ってCプログラムを作成してるのですが、ファイルについて質問があります。 あるテキストデータをfopen()でオープンし、その後fread()を使ってデータを取得しそのメモリをデバッガで参照すると改行がLFのみになっているですがこれはなぜなのでしょうか? バイナリエディタで参照すると改行はCRLFなのですが...。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.3

C言語が最初に使用されたOSで「改行は[LF]のみ」と決められていたから、C言語でも「改行は[LF]のみ」と決められました。 ところが、WindowsやMS-DOSの世界では「改行は[CR][LF]」と決められているので、そのままでは不都合が出ます。 例えば ABC[改行] DEF[改行] と言うファイルを1行づつ読んだとします。 ファイルの中身が「ABC[CR][LF]」になっているのに「改行は[LF]のみ」として扱うと、最初に読まれる1行は「ABC」ではなく「ABC[CR]」となってしまいます([LF]の手前までが1行であり[CR]は単なる文字として扱われてしまう。つまり、行末に余計な[CR]が残ってしまう) 「1行目は『ABC』である」と言う事を期待して書かれているプログラムは「ABC[CR]」が読み込まれてしまう為、正常に動かなくなってしまいます。 また、2行にまたがった文字列を出力しようと「ABC\nDEF\n」をファイルに出力した場合、ファイルに書かれるデータが「ABC[LF]DEF[LF]」のままだと改行に[CR]が足りない為、正しく2行のデータになりません。 そこで、ユーザーには見えない部分で「改行を示す文字が違っているのをコッソリ同じに書き替えてしまう」と言う事をして、問題が起きないようにしています。 つまり ・ファイルから読んだ2文字が[CR][LF]だったら[CR]を取り除いて[LF]だけにしてしまう ・ファイルに書き出す文字が[LF]だったら[CR]を付け足して[CR][LF]にしてしまう と言う細工が行われています。 但し、この細工を毎回行うとテキストデータではないバイナリデータを扱えなくなってしまう(バイナリデータを処理する際に勝手に[CR]が削られると困る)ので、ファイルのオープンに「テキストモード」「バイナリモード」と言う概念が導入されています。 つまり テキストモード=[CR]を削ったり追加したり細工をする バイナリモード=[CR]の細工をしない と言う2つのモードが作られた訳です。 オープン時のモードさえ間違わなければ「改行は[LF]のみ」と決めて作られている古いプログラムを、一切修正せず、コンパイルし直すだけで「改行は[CR][LF]」と決められたOSの上で使える訳です。

noname#11716
質問者

補足

長文に渡る回答ありがとうございました。 OpenSSLを使用して署名検証プログラムを作成していたのですがどうやっても署名のマッチング処理で署名検証でエラーが発生していたので、この改行の違いが原因にあるようですね~。 一つ勉強になりました。

その他の回答 (3)

  • qKAZp
  • ベストアンサー率47% (71/148)
回答No.4

CR と LF の話で、蛇足を1つ。 CR は キャリッジリターンの略で、ヘッドを行の先頭に持って行く操作。 LF は ラインフィードの略で、行を1行送る操作を表しています。 タイプライターって見たことありますか? 1行打ち終わった後、一旦一番先頭に印字位置がくるように紙を右に寄せます。これがキャリッジリターンです。その後、行送りキーを押すことで、1行紙を送ります。これがラインフィードな訳です。 では、なぜCR+LFとLFのみの違いが出来てしまったんでしょうね。 CR も LF も元はプリンタ制御コードなんですが、(CRTが無い時代は、出力は紙に印字して、それを読んでいました)UNIX系のメインフレームには、「ラインプリンタ」というのが使われていました。このプリンタは横一列に紙の印字幅分のヘッドが並んでいて、一度に1行全部を印字できるようになっていました。 そうです。だからCR(キャリッジリターン)が必要なかったんです。 ところが、DOS(の前身のCP/Mからかな?)のシステムは、高価なラインプリンタではなく(印字ヘッドが高価だったんですね)、今の様なヘッドが横に移動して印字するプリンタを使うようになったんです。(サーボの位置決め制御が精度よく出来るようになったので、横移動と縦移動の複雑な制御が出来るようになったんですね) そうです。この場合、次の行を印字するには、一旦ヘッドを先頭に戻さないといけませんから、CRがいるんですね。 で、UNIX系は LF のみ DOS系は CR+LF のセットになったという話。 『本当?』 「さ~どうなんでしょ?」

回答No.2

> まぁ、理由がよくわかりませんが...。 UNIX/Linuxとの'互換性'のため。 > ちなみにそういうガイドラインらしきものはあるのでしょうか? 'そういう'とは'どういう'? 'ガイドライン'って誰の/何の?

回答No.1

DOS/Windowsでは、テキストモードでfopenした場合、読み込み時にCR/LF→LFの変換が行われます。書き込み時にはその逆。

noname#11716
質問者

補足

おおー!!そうなんですか。 それは知りませんでした。 まぁ、理由がよくわかりませんが...。 ちなみにそういうガイドラインらしきものはあるのでしょうか?