私は C++ の初心者で、C++ Primer を終えたばかりで、自分のプロジェクトをいくつかいじっています。これを行っているときに気づいたことの 1 つは、C++ Primer がstd::fstream
ファイル IO の方法として強調する傾向がある一方で、多くのプログラムでは代わりにFILE*
.
これには何か理由がありますか?ある場合、どのような状況で使用fstream
しますか/使用するFILE
必要がありますか?
ありがとう!
C++ でstdio (つまり、関数のファミリ) を使用する唯一の理由は、パラメータFILE*
を取る C コードとのインターフェイスです。FILE*
stdio を使用して C や C++ を学んだ多くの人は、これらの関数が何らかの形で優れていると信じています。主な不満は、stdio を使用するフォーマット指定子が非常に短いことです。残念ながら、それらはエラーが発生しやすく、フォーマット指定子と実際の引数の間の矛盾を指摘する警告にもかかわらず、stdio を非自明で正しく使用するプログラムをまだ見たことがありません。
stdio が優れている IOstream の 1 つの省略は、scanf()
関数がいくつかの興味深い解析を実行できることです。これは非常に簡単に IOstream に追加できますが、標準ライブラリの一部ではありません (また、フォーマット指定子ほど簡潔ではありません)。
個人的には、利点と比較して欠点は無関係だと考えています。
一連の記事と初期の IOstream のいくつかの非常に悪い実装 (そのうちのいくつかはまだ一般的なプラットフォームに残っているようです) により、C++ ストリームは遅いという誤った評判を得ています。はい、stdio よりもかなり遅いことを確認することは可能ですが、stdio と同様のパフォーマンスでそれらを実装することは間違いなく可能です。ただし、ユーザーが回避する必要がある簡単なパフォーマンス ミスがいくつかあります。
std::endl
。限目。本当に改行の後にフラッシュを書くつもりなら、そう言ってください: out << '\n' << std::flush
. これは実際に行われていることですstd::endl
がstd::endl
、大部分のケースで誤って使用されており、意図しないフラッシュにより重大なパフォーマンスの問題が発生しています。std::sync_with_stdio(false);
ください。この効果は標準のストリーム オブジェクトにのみ必要ですが、ファイル ストリームにも影響する IOstream の不適切な実装があります。std::cin
stdin