こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

改行コードは一般的に、
Windows・・・「CR+LF」
UNIX or Linux・・・「LF」

だと思うのですが、改行コードが「LF」のファイルをWindows上で、C言語で編集したらどういった改行コードになるのでしょうか。
(例えば、単純にファイルを1レコードずつ読み込んで別ファイルに書き込むといった処理)

出力時に「CR+LF」になってくるのでしょうか?それともまったく別のものになってしまうのでしょうか?

詳しい方、ぜひ教えてください。


※改行コード「LF」のテキストファイルは、UNIXサーバから「HULFT」というファイル転送ソフトの「バイナリ転送モード」でWindowsサーバに送られてくる予定です。

投稿日時 - 2008-11-23 20:53:54

QNo.4501519

すぐに回答ほしいです

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

実行環境に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上のメモ帖やテキストエディタでは正常に開けません。

投稿日時 - 2008-11-25 13:23:31

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

> Windows上で、C言語で編集したら

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

投稿日時 - 2008-11-24 12:48:35

ANo.2

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

投稿日時 - 2008-11-24 08:26:06

ANo.1

WindowsのC言語プログラムで、そのファイルを
テキストファイルとして扱うか
バイナリーファイルとして扱うかによって
異なるのではないかと思います。

>ファイルを1レコードずつ読み込んで別ファイルに書き込む

テキストファイルとして扱った場合は、LFを読んで、
書くときにはCRLFを書くと思います。
バイナリーファイルとして扱った場合は、LFを読んだら
そのままLFを書くだけだと思います。

テストプログラムを書くなどの方法で確かめられるとよいと思います。

投稿日時 - 2008-11-23 21:02:40

あなたにオススメの質問