質問

必然的にWindowsプラットフォームで表示されるテキストファイルを生成するLinuxプラットフォームでプログラムを作成しています。

今、 std :: endl ostream に渡すと、改行用のCR文字のみが生成されます。当然、これらのテキストファイルはMS Notepadで正しく表示されません。

  1. LFの代わりにCR + LFを改行に使用するように std :: endl を変更する方法はありますか?
  2. 独自の改行を生成するために、 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を吐き出します。

この問題に対する私の解決策がここにありました。回答で提供されるすべての情報のマッシュアップです:

  1. 必要な改行用にwin_endl.hファイルにマクロを作成しました:

    #define win_endl "\r\n"
    
  2. 次に、検索と置換を行いました:

    sheepsimulator@sheep\_machine > sed -i 's/std::endl/win_endl' *
    

また、すべてのファイルに win_endl.h が含まれていることを確認しました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top