• ベストアンサー

改行コードの謎

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

noname#11716
noname#11716

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

  • ベストアンサー
  • 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
質問者

補足

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

関連するQ&A

  • 改行コードについて

    HTMLフォームのテキストエリアで改行した場合の処理についてご質問します。 Windowsのローカル環境で試しています。 改行コードLFでPHPを作成しています。 ○改行コードの認識 LF(\n) Unix,Mac OS X CR(\r) Mac OS 9 CRLF(\r\n) ○テキストエリアからの入力値の処理 CRLF、CRをLFに変換しています。 $value= str_replace ("\r\n", "\n", $value); $value = str_replace ("\r", "\n", $value); このあとDBに値を格納しています。 ○出力の際の処理 DBから値を取得。 phpのprint関数で下記を出力。 <textarea >${value}</textarea> 上記処理で、ローカル、サーバともに正常に動作しています。 しかし改行コードがLF(\n)なのでCRLF(\r\n)のWindowsで表示したときには問題が起きそうな気がします(実際には正常に動作)。 なにかしっくりこなくて質問させていただきました。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • バイナリファイルに改行コードを追加したい

    C言語でマルチバイト文字(全角文字)を含めたバイナリファイル(改行のないテキストファイル)に指定したバイト長ごとに改行コードを追加するにはどのようにしたら良いのでしょうか?。 漠然とですがfopen()とfread()などを使うんだろうと おもうのですが、読み込んだ文字数の計算方法がわかりません。 どなたかご教授お願いします。

  • 改行コードについて

    改行コードがよく解らないので説明お願いします 様々なサイトの改行コードの説明で LinuxはLF MacはCR WindowsはCRLFと説明しています 私の認識では LF=\n CR=\r CRLF=\r\n だと思っていました ここで疑問なのですが 確かに私の利用した環境ではLinuxの改行コードは\n, Windwosの改行コードは\r\nでした ところがMacの標準のメモ帳(テキストエディット)で文字を入力しても改行コードは\nです 確認方法は od -cというコマンドとfileというコマンドです これはつまりCRではなくLFということですよね? では、なぜ多くのサイトではMacはCRと説明しているのでしょうか? そもそもCR=\rという認識が間違ってるのでしょうか? よろしくお願いします

  • TEXTAREAで改行するとついてくるゴミコード

    自分で作成したCGIで送信されてきたフォームデータを 取得し、テキストファイルに出力するような処理をやってまして、 その送信されるデータにはTEXTAREAで入力されたデータもあります。 CGIの処理後に出力されたファイルをテキストエディタで開こうしたら、 テキストエディタでオープン不正であるようなメッセージが表示されました。 自分でもその原因についてバイナリエディタで調べたところ、 TEXTAREAで改行されたところに不正なゴミコードが混ざっているようでした。 改行コードは16進数でいうと「0D0A」のはずですが、バイナリファイルで みたところ改行部分が「0D0D0A」となっているようで、どうやら「0D」の余計な コードがテキストエディタで開いた時、エラーを発生させている原因となってるようです。 CGIの処理内でこの「0D」コードを削除する処理をいれるのもいいんですが、 なにか簡単にこの「0D」というゴミコードを取り除きたいのですが、 ナニかいい方法ないでしょうか?

    • ベストアンサー
    • CGI
  • 改行コードの変換方法

    Excelシート内にあるテキストボックスの改行コード(LF)が多数存在してます。 これを改行コード(CRLF)に簡単に変換する方法はありますか? 対象文字を選択してExcelの置換機能で変換できませんか?

  • VB6のテキスト処理 さまざまな文字コード/改行で対応

    VB6のテキスト処理で、Open InputとLine inputを使った場合に 文字コード/改行コードが SJIS/CRLFの時は正しく1行を読み込む事ができますが、改行がLFの時は正しく1行を読み取りません。 改行コードがLFもしくはCRの場合でも正しく1行を読み取る方法はあるのでしょうか? また、文字コードに関してもEUCやUTF-8,JISでも対応できる方法がありましたら教えて下さい。

  • MACの改行コード変更について教えてください。

    Macのテキストエディットを使用しています。 (使用PCは、MacOSX(10.6.8)です。) 改行コードをCRLFやLFではなく、CRだけにしたいと考えています。 変更法をご存知の方、教えてください。 初心者の為、どうぞよろしくお願いいたします。

    • ベストアンサー
    • CGI
  • Linuxにperlをアップする際の改行コード?

    こんにちは。フリーのメールCGIをテストでFedoraCore1にnextFTPでアップしたところサーバーエラーが出たので色々しらべていたら1行目のパスに #!/usr/bin/perl -- のように--を追加すると動作OKになりました。 これは改行コードがWInがCRLFでLinuxがLFということなのでという解答なのですが疑問があります。 ↓参照 http://oshiete1.goo.ne.jp/kotaeru.php3?q=767872 nextFTPは自動でテキストかバイナリを判別しますよね。 試しにもうひとつのRedHatには--をいれずにアップしたら何の問題もなく動作します。 この違いはいったい? おわかりの方がいらっしゃいましたらご教授おねがいします。

  • 【テキスト】改行コードCR+LFの時だけ改行したい

    こんにちは。 HTMLを記述したテキストを含むCSVファイルを、 メモ帳で開くと1行で表示されるのですが、 それをexcelや、テキストエディターで開くと メモ帳で改行していないところで改行されてしまいます。 おそらく、テキストエディターでHTMLを書いた部分は途中で改行されないのですが、 Dreamweaverで書いた部分で改行が入っている様なのです。 調べると、改行コードというのがいくつかあり、メモ帳では改行されないが、 その他の高機能エディターでは改行するコードがあり、 それが途中に入っている様な感じです。 メモ帳で開く様に、改行コードCR+LFの時だけ改行して、 改行していないところでは改行を入れないで開きたいのです。 この、「メモ帳では改行しない改行コード」だけを取り除いて保存することはできるのでしょうか。 高額なテキストエディターでは、そのような事ができるようなのですが、 できればフリーソフトで完結したいです。 よろしくお願いします。

  • 改行コードを変換せずにアップする際の不具合

    FTPでアップする際の改行コードについてお教え下さい。 Windowsの改行コードのまま(バイナリーモード)にてunixサーバーへアップロードすると apacheやphpなどモジュールやhtmlの表示で不具合が発生することはありますか? 目的として、バイト数で差があるか確認したいので、crlf > lf 変換をしたくありません。 どなたかご教授頂けますと助かります!

専門家に質問してみよう