2009-10-30 31 views
8

私はLinuxプラットフォームで、Windowsプラットフォームでは必然的に表示されるテキストファイルを生成するプログラムを作成しています。LFの代わりにCR + LFを出すためにstd :: endlを変更する

今のところstd::endlostreamに渡すと、改行のみのCR文字が生成されます。当然、これらのテキストファイルはMS Notepadで間違って見えます。

  1. std::endlには、LFではなく改行にCR + LFを使用するように変更する方法はありますか?
  2. 私自身の改行を生成するために、win_endlのような独自のカスタムマニピュレータを書くことができますが、私は多くの場所でstd::endlシンボルを使用し、多くのプログラマと同様に、可能な作業。 CR + LFを生成するために単にstd::endlをオーバーロードすることができますか?これはメンテナンス性のための愚かな考えですか?

NB:this questionをチェックアウトしましたが、それ以外の方法について質問しています。回答が不完全であるようです。

+3

もう一つの選択肢は、Unixスタイルの改行(メモ帳以外のほぼすべてのエディタ)を扱う方法を知っているツールを使用するか、行末を変換するツール(一般にunix2dos.exeなど) 。 –

+0

@Michael Burr - 良いアイデアは、私たちの顧客ベースでサポートするのが難しいですが、私の腸の反応です。 –

+1

それは顧客のマシン上で実行する必要はありません - Unixボックスでも同じことをするフィルタがあります。現在のプログラムで生成された出力ファイルをフィルタに通してから、顧客に配布することができます。それはハッキーのようだが、実際にはC++のストリーミオを使うよりもハッキリではないかもしれないと思う。 –

答えて

8

ファイルをテキストモードで開くと、std::endlがプラットフォームの該当する行末に変換されるはずです。あなたの問題は、ご使用のプラットフォームに対応する改行であることですが、作成するファイルはご使用のプラットフォーム用ではありません。

endlのオーバーロードや変更をどのように計画しているのかよく分かりませんが、その動作を変更することは、あなたのプロジェクトに初めて参加する開発者にとっては驚くべきことです。 win_endlに切り替えることをお勧めします(単純な検索と置換のはずです)。ostreamからBoost.Iostreams filtering streamへの変換をお勧めします。

+1

+1。より具体的には、newline_filterを使用してください:http://www.boost.org/doc/libs/1_40_0/libs/iostreams/doc/index.html?path=4.2.10.1 –

+0

このルートに行ったでしょうか(マクロ維持するのは面倒です)しかし、私たちは仕事場で豚肉を増やすための愚かなシステムを持っています。 –

9

std::endlはbasiclyです:

std::cout << "\n" << std::flush; 

だから代わりに"\r\n"を使用してフラッシュを省略します。そんなに速いです! ENDL上のostreamヘッダファイルから

単純な改行が所望される場合、このマニピュレータはしばしば誤っ貧弱緩衝性能をもたらすために使用されます。

+5

これを行うなら、忘れないでくださいストリームをバイナリモードで開く - そうでなければ、このコードをWindowsに移植すると、出力に '\ r \ r \ n'が得られます(' \ n'自体は '\ r \ nに展開されるので'テキストストリームの場合)。 –

+0

これはWindowsに移植されません。私たちはおそらくライセンスを扱うことができませんでした。 lol –

+0

+1 - エンドマニピュレータの良い情報。 Methinks私はそれほど頻繁に使用しません。 –

2

\ r \ nは使用しないでください。 \ nを使用するだけですが、変換を行うよりも「テキスト」モードでストリームを開きます。クロスプラットフォームについては気にしないかもしれませんが、これは公式なやり方です。

こうすれば、同じコードがUNIXでは\ n、Windowsでは\ r \ n、macでは\ rが吐き出されます。

+5

また、メモ帳を使用しないでください – Cogwheel

+0

テキストファイルを生成するプログラムはLinuxプラットフォームで実行され、Win/Macではまったく実行されません。テキストファイルを読み込んだマシンは、コンシューマーOS(Windows、Mac、Linux)を実行します。 –

+5

あなたは実際に質問を読んだことがありますか? – mch

4

WindowsノートパッドはほとんどのWindowsプログラムでは、LF専用ファイルは適切に処理されません。他のほとんどのもの(ワードパッドを含む)は、LFのみのファイルをうまく処理します。

この問題は、メモ帳のバグです。

+0

お客様は、そのファイルをダブルクリックするだけで、その時点で自分のマシンに登録されているアプリがあれば、それを利用できます。 Windowsのデフォルトのメモ帳です。 –

+0

代わりにhtmlを生成しますか? – ebo

+3

CRLFの行末でファイルを作成する必要がある場合は、プログラム自体とは独立したフィルタを使用して出力ファイルを実行します。あなたはこの種のフィルタを簡単に見つけることができ、 'unix2dos'かそのようなものを探します。これにより、このプラットフォーム固有のロジックがプログラムから保護されます。 –

0

ここに私の解決策がありました。それは答えで提供されるすべての情報のマッシュアップのビットです:

  1. 私は私が欲しかったの改行のためwin_endl.hファイル内のマクロを作成しました:Iその後

    #define win_endl "\r\n" 
    
  2. [email protected]\_machine > sed -i 's/std::endl/win_endl' * 
    

をそして、すべての私のファイルがwin_endl.hを含ま確保:検索と置換んでした。

+0

"\ n"はプラットフォーム固有の行末シーケンスに変換されるので、これは実際にはテキストモードを使用している場合の解決策ではありません。 Linuxでは、 "\ n"はLF文字に直接マップします。しかし、Windows上でこのコードを実行すると、Windows上で「\ n」がCR-LFにマップされるため、CR-CR-LFが表示されます。 –

+0

@Brian Neal - 良い点。 –

関連する問題