0

ほとんどがc++であるプログラムでこれらの関数を使用することが許容できると思うかどうか、私は物事のスタイルの側面で疑問に思いました。私にはc++クラスを教えている教授がいるので、その例はc文字列、文字列からc文字列への変換、sscanf、sprintfなどでいっぱいです。

4

1 に答える 1

2

さて、ここにあなたが決定するのを助けるために一般的なストリーム対stdio問題に関するいくつかのポイントがあります。stringstreamほとんどはvs sprintf/に適用できsscanfます。バッファリングされた非メモリストリーム(ファイル、stdin / stdoutなど)が関係する場合にのみいくつかあります。

  • ストリームはタイプセーフであるため、プログラムをコンパイルすると通常は正常に実行されますが、stdio形式の文字列を引数や型に一致させるとエラーが発生しやすく、コンパイラーはそれを検証する必要がありません(一部の可能性はありますが)
  • それらを混合することになった場合はsync_with_stdio、ストリーム(http://www.cplusplus.com/reference/iostream/ios_base/sync_with_stdio/)でメンバーを使用する必要があります。これにより、速度が低下する可能性があります。
  • の標準Cバージョンなどではscanfprintf作成する新しいタイプをサポートするカスタマイズが許可されていません。これは、さまざまなタイプを印刷するポリモーフィックコード(テンプレート、マクロなど)の作成と使用を非常に制限し、苛立たせます。
    • GNUのようないくつかの実装にはいくつかのカスタマイズ機能があります
  • printf/scanfスタイル形式の文字列は、C ++ストリーミングよりも簡潔にすることができます(特にiomanipを使用する場合)が、読みやすさについては習熟度に依存します
  • ほとんどのサードパーティのC++コードには、ストリーミング機能のみが付属しています
  • 実際には、printf/scanfは、実行時にタイプ固有の処理に切り替える必要があるにもかかわらず、多くの場合高速ですが、コストがかかります。ロケール固有の動作、呼び出し間で永続的な動作など、一部のストリーム機能が不足しています。
  • printf/scanfなどを使用して、フォーマット文字列を指定する構成に基づいてランタイムI / O解析を変更できる場合があります(これは、引数リスト内の位置を示すために数値を使用して引数を参照できるGNUのような拡張機能を使用すると簡単です。フォーマット文字列と引数を対応させる必要があるよりも); それでも、これは脆弱であり(間違いが頻繁にプログラムをクラッシュさせます)、国際化を頻繁に使用しようとする場合、その目的のために特別に設計された施設ほど機能的ではありません。
于 2012-08-30T05:27:56.903 に答える