LFではなくCR + LFを出力するようにstd :: endlを変更する
質問
必然的にWindowsプラットフォームで表示されるテキストファイルを生成するLinuxプラットフォームでプログラムを作成しています。
今、 std :: endl
を ostream
に渡すと、改行用のCR文字のみが生成されます。当然、これらのテキストファイルはMS Notepadで正しく表示されません。
- LFの代わりにCR + LFを改行に使用するように
std :: endl
を変更する方法はありますか? - 独自の改行を生成するために、
win_endl
などの独自のカスタムマニピュレータを作成できることは知っていますが、多くの場所でstd :: endl
シンボルを使用しています、そして多くのプログラマーと同様に、必要最小限の作業で済むことをする傾向があります。std :: endl
を単純にオーバーロードしてCR + LFを生成できますか、またはこれは保守性の馬鹿げたアイデアですか?
NB:この質問をチェックアウトしましたが、尋ねています他の方法について説明し、受け入れられた答えはかなり不完全に見えます。
解決
テキストモードでファイルを開くと、 std :: endl
がプラットフォームに適した行末に変換されます。問題は、改行がプラットフォームに適していることですが、作成するファイルはプラットフォーム用ではありません。
endl
のオーバーロードまたは変更をどのように計画するかわかりません。その動作を変更することは、プロジェクトに初めて参加する開発者にとって驚くべきことです。 win_endl(単純な検索と置換)に切り替えるか、標準の ostream
から Boost.Iostreamsフィルタリングストリームを使用して変換を行います。
他のヒント
std :: endl
は基本的に:
std::cout << "\n" << std::flush;
したがって、代わりに&quot; \ r \ n&quot;
を使用して、フラッシュを省略します。その方法でも高速です!
endlのostreamヘッダーファイルから:
このマニピュレータは、単純な改行が必要な場合に誤って使用されることが多く、バッファリングのパフォーマンスが低下します。
Windowsのメモ帳は、LFのみのファイルを適切に処理しないWindowsプログラム only です。他のほとんどすべて(ワードパッドを含む)はLFのみのファイルをうまく処理します。
この問題はメモ帳のバグです。
\ r \ nは使用しないでください。 \ nを使用しますが、&quot; text&quot;でストリームを開きます。モード、それはあなたのために変換を行います。クロスプラットフォームは気にしないかもしれませんが、これは公式の方法です。
その方法で、同じコードがUNIXでは\ n、Windowsでは\ r \ n、macでは\ rを吐き出します。
この問題に対する私の解決策がここにありました。回答で提供されるすべての情報のマッシュアップです:
-
必要な改行用にwin_endl.hファイルにマクロを作成しました:
#define win_endl "\r\n"
-
次に、検索と置換を行いました:
sheepsimulator@sheep\_machine > sed -i 's/std::endl/win_endl' *
また、すべてのファイルに win_endl.h
が含まれていることを確認しました。