• ベストアンサー

C言語での改行コードの扱いについて教えてください。

改行コードは一般的に、 Windows・・・「CR+LF」 UNIX or Linux・・・「LF」 だと思うのですが、改行コードが「LF」のファイルをWindows上で、C言語で編集したらどういった改行コードになるのでしょうか。 (例えば、単純にファイルを1レコードずつ読み込んで別ファイルに書き込むといった処理) 出力時に「CR+LF」になってくるのでしょうか?それともまったく別のものになってしまうのでしょうか? 詳しい方、ぜひ教えてください。 ※改行コード「LF」のテキストファイルは、UNIXサーバから「HULFT」というファイル転送ソフトの「バイナリ転送モード」でWindowsサーバに送られてくる予定です。

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

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

実行環境にWindowsを想定している処理系では、ファイルをオープンする際のオープンモードには「テキスト」と「バイナリ」の区別があります。 テキストタイプでオープンすると、ファイルストリーム中の改行コードが自動的に加工されます。 具体的には、 ・アプリケーションでストリームを読み込むと、ファイル中のCR+LFがLFに置き換わって読み込まれる。 ・アプリケーションからストリームに書き込むと、データ中のLFがCR+LFに置き換わって書き込まれる。 という加工が行われます。 一方、バイナリタイプでオープンした場合、加工は一切行われません。 つまり「ソースコード上では、改行は\nの1文字のみ。実ファイル上で改行がどんな文字コードになっているか考慮する必要はない」と言う事です。 なので、ファイルのデフォルトのオープンモードが「テキスト」になっている場合は、 ofp=open("textfile.txt","w"); fprintf(ofp,"It is text\nHello world\n"); fclose(ofp); と言うプログラムは、WindowsでもUNIX/Linuxでも、どちらも正しく動作します。(明示的にテキストモードでオープンする場合は、オープンモードの"w"を"wt"にすること) 質問者さんのケースでは、 ・Windowsサーバにファイルが届いた時点で、改行はLFのみ⇒このファイルは「バイナリタイプ」でオープンする。 ・普通に「1行読む」と言う処理をする⇒ストリームから読む際は「LFまでが1行」として読まれる。 ・別ファイルは「テキスト」でオープンする。 ・読み込んだ1行を、何も加工せずに別ファイルに改行付き(\n付き)で書き出す⇒改行が勝手にCR+LFに変換されてファイルに書き出される。 ・ファイルの最後まで繰り返す。 という処理をすればOKです。 なお、ファイル転送ソフトでバイナリモードのままWindowsサーバに届いたファイルは、Windows上では「改行の無いファイル」として扱われますから、Windows上のメモ帖やテキストエディタでは正常に開けません。

その他の回答 (3)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

> Windows上で、C言語で編集したら 処理系によります。 例えば、Cygwinの場合、インストール時に改行コードがUnixと同じになるように設定すれば、Windows上で動作しているにもかかわらず改行コードはLFだけになります。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

Windowsで普通にファイルをオープンした場合はテキストモードになります。 テキストモードというのは改行コードを自動的に変換するモードです。 読み込みの場合は元のファイルの改行コードがCR+LFの場合はLFだけに変換されます。LFだけの場合はそのままです。 そしてCプログラム内では改行コードはLF('\n')のみで処理されます。 テキストモードでの書き込みの場合にはLFをCR+LFに変換して書き込みます。 ファイルオープンをバイナリモード("rb"や"wb"など)で行った場合はこのような変換は行われません。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

WindowsのC言語プログラムで、そのファイルを テキストファイルとして扱うか バイナリーファイルとして扱うかによって 異なるのではないかと思います。 >ファイルを1レコードずつ読み込んで別ファイルに書き込む テキストファイルとして扱った場合は、LFを読んで、 書くときにはCRLFを書くと思います。 バイナリーファイルとして扱った場合は、LFを読んだら そのままLFを書くだけだと思います。 テストプログラムを書くなどの方法で確かめられるとよいと思います。