2009-04-08 4 views

答えて

2

Windowsコンソールは、ファイルに対して想定されているのと同じ行終了規則、つまり実際の物理端末の場合に従います。次の行に適切に移動するには、CRとLFの両方を確認する必要があります。

つまり、ANSI Cプログラムとそのコンソールの間には、多くのソフトウェアインフラストラクチャがあります。特に、標準のCライブラリI/O関数は、あなたがそれを可能にしたと仮定して、正しいことをしようとします。そのため、modeパラメータのfopen()tbの修飾語が定義されています。その後、印刷された任意\ntstdinstdoutための最もストリームのデフォルト、および特に)で

は、CRLFシーケンスに変換され、読み出しのために逆が起こります。その動作を無効にするには、修飾子bを使用します。

ちなみに、XTermでエミュレートされたDEC VT100を含む* nixボックスに伝統的に接続されていた端末もCRとLFの両方が必要です。しかし、* nixの世界では、改行文字からCRLFシーケンスへの変換はttyデバイスドライバで処理されるので、ほとんどのプログラムはそれについて知る必要はなく、tb修飾子はどちらも無視されます。これらのプラットフォームでは、変更を加えずにttyに文字を送受信する必要がある場合は、stty(1)またはそれが依存するシステムコールを参照する必要があります。

コンソールの文字色やその他の属性にアクセスする必要があるため、ANSI CプログラムがCライブラリのI/Oを回避している場合、CRを送信する必要があるかどうかは、どのWin32 API文字を送信するために使用しているコール。

1

* nix環境にいる場合は、\ n(改行)はおそらく問題ありません。あなたがWindowsでリダイレクトしていない場合(現在)リダイレクトされていませんが改行もOKですが、誰かがリダイレクトした場合は:-(

Windowsを実行している場合、出力がテキストファイルにリダイレクトして、別のプロセスがデータを消費しようとします。

コンソールを表示するために知っているが、消費者は幸せではないかもしれません...

はC#を使用している場合は、環境を試みる場合があります。 NewLine "constant"。

http://msdn.microsoft.com/en-us/library/system.environment.newline.aspx

あなたが本当にバニラのCであれば、あなたは\ r \ nで立ち往生しています。 :-)

+1

実際、完全に真実ではありません。 Cランタイムライブラリは、ANSI CファイルI/Oに対して賢明な変換を行うのに非常に注意しています。つまり、fopen()のtとb修飾子が発明されたのはまさにその理由です。標準ストリームはテキストモードで開かれます。ただし、変更するために何か努力をしないと、Windowsユーザーが期待するようにパイプラインとリダイレクトが機能します。 Win32 APIを直接呼び出すと、その話は異なりますが、ANSI C I/Oはこれ以上実行されません。 – RBerteig

+0

DotNetでは、あなたは '\ r \ n'中間文字列にも悩まされています。 Environment.NewLineがCR LFに '\ n'をマップしていないのは驚くべきことです。これは単に文字列の最後にStreamWriter.WriteLineが吐き出すものです。 – H2ONaCl

0

それはあなたがそれらを使用しているかによって異なります。 \r\nの両方を入力しないと、一部のプログラムで改行が正しく表示されません。

\nのみを書き込もうとすると、テキストファイル(または出力)を消費するプログラムによっては、複数の行ではなく1行でテキストが表示されることがあります。

\r\nの両方を使用せずに完全に無効になるファイル形式とプロトコルもあります。

0

私は何が起こったのかよくわからないほど長くは試していませんでしたが、それだけでラインフィードは行の下を左の列に戻ることなく移動しませんか?

コンパイラによっては、標準出力をテキストモードで開くことができます。この場合、1行の改行は書き出される前に\ r \ nに変換されます。

編集:私はちょうど簡単なテストを試みましたが、XPではリターンのないファイルが正常に表示されました。コンパイラがあなたのために返品を挿入するかどうかはまだ分かりません。

0

Cでは、ファイル(「ストリーム」と呼ばれます)は2つのフレーバー(バイナリまたはテキスト)で表示されます。

この区別の意味は、実装/プラットフォームに依存しますが、テキストストリーム '\ n'への書き込みが自動的に「\ r \ n」に変換されると、Windows上で(共通の実装で)テキストストリーム「\ r \ n」からの読み込みが自動的に「\ n」に変換されます。

「コンソール」は実際には「標準出力」です。これは、デフォルトでテキストストリームとして開かれたストリームです。したがって、実際にはWindows上で、 "Hello、world!\ n"と書いておくと十分なはずです。

関連する問題