1

私は C++ の初心者で、C++ Primer を終えたばかりで、自分のプロジェクトをいくつかいじっています。これを行っているときに気づいたことの 1 つは、C++ Primer がstd::fstreamファイル IO の方法として強調する傾向がある一方で、多くのプログラムでは代わりにFILE*.

これには何か理由がありますか?ある場合、どのような状況で使用fstreamしますか/使用するFILE必要がありますか?

ありがとう!

4

1 に答える 1

2

C++ でstdio (つまり、関数のファミリ) を使用する唯一の理由は、パラメータFILE*を取る C コードとのインターフェイスです。FILE*stdio を使用して C や C++ を学んだ多くの人は、これらの関数が何らかの形で優れていると信じています。主な不満は、stdio を使用するフォーマット指定子が非常に短いことです。残念ながら、それらはエラーが発生しやすく、フォーマット指定子と実際の引数の間の矛盾を指摘する警告にもかかわらず、stdio を非自明で正しく使用するプログラムをまだ見たことがありません。

stdio が優れている IOstream の 1 つの省略は、scanf()関数がいくつかの興味深い解析を実行できることです。これは非常に簡単に IOstream に追加できますが、標準ライブラリの一部ではありません (また、フォーマット指定子ほど簡潔ではありません)。

個人的には、利点と比較して欠点は無関係だと考えています。

  • タイプセーフな読み書き
  • ユーザー定義型のユーザー定義サポート
  • ユーザー定義のソースと宛先のサポート
  • 数値型の書式設定をある程度制御する

一連の記事と初期の IOstream のいくつかの非常に悪い実装 (そのうちのいくつかはまだ一般的なプラットフォームに残っているようです) により、C++ ストリームは遅いという誤った評判を得ています。はい、stdio よりもかなり遅いことを確認することは可能ですが、stdio と同様のパフォーマンスでそれらを実装することは間違いなく可能です。ただし、ユーザーが回避する必要がある簡単なパフォーマンス ミスがいくつかあります。

  1. 使用しないでくださいstd::endl。限目。本当に改行の後にフラッシュを書くつもりなら、そう言ってください: out << '\n' << std::flush. これは実際に行われていることですstd::endlstd::endl、大部分のケースで誤って使用されており、意図しないフラッシュにより重大なパフォーマンスの問題が発生しています。
  2. ライブラリが stdio 操作との同期を維持するために時間を無駄にしないようにしてstd::sync_with_stdio(false);ください。この効果は標準のストリーム オブジェクトにのみ必要ですが、ファイル ストリームにも影響する IOstream の不適切な実装があります。std::cinstdin
于 2012-05-13T22:43:23.227 に答える