\nはCRとLFで構成されていると読みました。それぞれに独自のASCIIコードがあります。
では、Cの\ nは単一の文字で表されているのでしょうか、それとも複数の文字で表されているのでしょうか。
編集:単に「はい、そうです」または「いいえ、そうではありません」と言うのではなく、あなたの答えを親切に指定してください
\nはCRとLFで構成されていると読みました。それぞれに独自のASCIIコードがあります。
では、Cの\ nは単一の文字で表されているのでしょうか、それとも複数の文字で表されているのでしょうか。
編集:単に「はい、そうです」または「いいえ、そうではありません」と言うのではなく、あなたの答えを親切に指定してください
Cプログラムでは、これは1文字で、'\n'
行末を表します。ただし、一部のオペレーティングシステム(特にMicrosoft Windows)は、テキストファイルの行末を表すために2文字を使用しており、これが混乱の原因である可能性があります。
'\n'
C表現とOSが使用するものとの間の変換を行うのは、CI/O関数の責任です。
Cプログラムでは、単に。を使用します'\n'
。正しいことが保証されています。ある種のエディタでテキストファイルを見ると、2文字が表示される場合があります。テキストファイルをWindowsからUnixベースのシステムに転送すると"^M"
、各行の最後に表示される場合があります。これは煩わしいことですが、Cとは関係ありません。
一般的に:'\n'
は改行を表す単一の文字です。'\r'
は、キャリッジリターンを表す単一の文字です。それらは独自の独立したASCII文字です。
問題が発生するのは、実際のファイル表現では、UNIXベースのシステムは'\n'
、キーボードで「Enter」または「Return」を押したときの考えを表すために単独で使用する傾向があるのに対し、Windowsは'\r'
その後に直接。を使用するため'\n'
です。
ファイル内:
"This is my UNIX file\nwhich spans two lines"
"This is my Windows file\r\nwhich spans two lines"
もちろん、すべてのバイナリデータと同様に、これらの文字はすべて解釈に関するものであり、その解釈はデータを使用するアプリケーションによって異なります。コメントで指摘されているように、OSの表現は関係ないため、文字通りのキャリッジリターンが必要な場合を除いて、C文字列を作成するときは「\n」に固執します。Cを含むIOライブラリは、これを自分で処理し、抽象化することになっています。
好奇心のために、10進数'\n'
でASCIIは10、13ですが'\r'
、これはASCII標準であり、C標準ではないことに注意してください。
場合によります:
'\n'
単一文字(ASCII LF)"\n"
'\n'
文字の後に0ターミネータが続く一部のI/O操作は、一部のシステム(CR-LF)でに変換'\n'
されます。'\r\n'
Windows C stdioライブラリを使用してファイルに出力\n
すると、ライブラリはそれをリテラル文字ではなく論理改行として解釈します0x0A
。ファイルへの出力は、Windowsバージョンの改行:( 0x0D0A
)になり\r\n
ます。
書き込み
サンプルコード:
#include <stdio.h>
int main() {
FILE *f = fopen("foo.txt","w");
fprintf(f,"foo\nbar");
return 0;
}
すぐcl /EHsc foo.c
に後で、あなたは得る
0x666F6F 0x0D0A 0x626172 (separated for convenience)
16進エディタの下のfoo.txtにあります。
'バイナリモード'でファイルに書き込んでいる場合、この変換は行われないことに注意することが重要です。
読む
同じツールを使用してファイルを読み戻している場合、Windowsでも、と照合しようとすると「windowsEOL」が正しく解釈されます\n
。
読み返すとき
#include <stdio.h>
int main() {
FILE *f = fopen("foo.txt", "r");
char c;
while (EOF != fscanf(f, "%c", &c))
printf("%x-", c);
}
あなたが得る
66-6f-6f-a-62-61-72-
したがって、これがあなたに関連する必要があるのは、あなたが
\n
直接変換されるため、ここで実際に説明する必要はありません。0x0A
(OSX以前\n
は0x0D
mac iircにありました)\n
は改行です。これは、テキストファイル内のある行を別の行から区切るものを論理的に表したものです。
特定のプラットフォームには、ライン間の論理的な分離を物理的に表現したものがあります。Unixおよびほとんどの同様のシステムでは、改行は改行(LF)文字で表されます(UnixはCと非常に密接に関連しているため、UnixではLFは単に改行と呼ばれることがよくあります)。MacOSでは、通常、キャリッジリターン(CR)で表されます。他のかなりの数のシステム、最も目立つのはWindowsで、キャリッジリターンとラインフィードのペアで表されます。通常はこの順序ですが、LFの後にCRが続くものが見られることがあります(私が覚えているように、Clarionはそれを行う)。
理論的には、改行はストリーム内のどの文字にも対応する必要はありません。たとえば、システムには、適切な文字数が後に続く長さとして保存されたテキストファイルを含めることができます。このような場合、ランタイムライブラリは、テキストファイルの内部表現と外部表現の間で、現在一般的であるよりもわずかに広範な変換を実行する必要がありますが、これは現実です。
C99標準(セクション5.2.2)によると、
\ n「アクティブな位置(fputcの次の文字が表示される場所)を次の行の初期位置に移動します」。
また
[ \ n ]は、単一のcharオブジェクトに格納できる一意の実装定義値を生成します。テキストファイルの外部表現は、内部表現と同一である必要はなく、[C99標準]の範囲外です。
ほとんどのC実装は\n
、歴史的な理由からASCII改行(0x0A)として定義することを選択します。ただし、多くのコンピュータオペレーティングシステムでは、アクティブ位置を次の行の先頭に移動するためのシーケンスには、通常0x0D、0x0Aの2文字が必要です。したがって、テキストファイルに書き込む場合、C実装は0x0Aの内部シーケンスを0x0D、0x0Aの外部シーケンスに変換する必要があります。これがどのように行われるかはC標準の範囲外ですが、通常、ファイルIOライブラリはテキストモードで開かれたすべてのファイルに対して変換を実行します。
あなたの質問はテキストファイルについてです。
テキストファイルは一連の行です。行は、改行で終わる(および改行を含む)文字のシーケンスです
。改行は
、オペレーティングシステムによって表現が異なります。
Unix / Linux / Macでは、通常、単一の改行で表され
ます。Windowsでは、通常、キャリッジリターンとラインフィードのペアで表されます。
古いMacでは、通常、単一のキャリッジリターンで表されます。
他のシステム(AS / 400 ??)改行を表す特定の文字ではない場合もあります...
とにかく、のライブラリコードは、テキストファイルを読み取るときにC
システムの改行をに変換し、テキストファイルを書き込むときに逆の操作を実行する役割を果たします。'\n'
したがって、特定のシステムでの表現に関係なく、でテキストファイルを読み取るとC
、行は。で終了し'\n'
ます。
注:これ'\n'
は必ずしも0x0a
すべてのシステムにあるとは限りません。
はい、そうです。
\n
改行です。16進コードは0x0Aです。
\r
キャリッジリターンです。16進コードは0x0Dです
単文字です。これは改行を表します(ただし、唯一の表現ではありません-ウィキペディア)。
編集:私が答えを入力している間に質問が変更されました。