Cみくださいますようお願いいたし使用する必要があC++のコードについて教えてください。[定休日]
質問
新C++のコードを使うのは、C++iostream図書館ではなく、C stdio図書館があります。
にのって一部のプログラマのようにこだわり、stdio,主張できます。
ではそうでしょうか?何が良いのですか?
解決
回答の質問:
何でも使用できないstdioきをベースに制御を行っています。iostream図書館があります。
Disadvantages of iostreams: verbose
Advantages of iostreams: easy to extend for new non POD types.
の一歩をC++のもとに行われたCタイプ。
iostreamsことができるように設計されて明示的に型安全です。このように代入オブジェクトへの明示的に認のタイプ(コンパイラのオブジェクトを割り当ても生成コンパイル時にエラーの場が必要です。することができることを理由に実行時のメモリのオーバーまたは書き込みのfloatの値をcharオブジェクト等
うな入力は、c言語ではscanf()/printf()と家族に頼るプログラマーのフォーマット文字列の正しいありませんタッると思いgccが延長する).その結果では、ソースの多くのバグ(プログラマーとしては最適ですその分析によりコンパイラでコンパイル[ならないと言うコンパイラに最適でより人間]).
での解明からのコメントコリン-Jensen.
- のiostream図書館が安定してからリリースの最後の基準を忘れてしまったのは約10年となりました。
の明確化によるコメントMikael Jansson.
- その他の言語と記載を利用する形式のスタイルって明示的な保障措置の防止、危険な副作用のC stdio図書館では(Cが上記の言語)を起こす実行時ンダリングする能力があります。
N.B. 私は同意するものとしまiostream図書館についてのデフォルト値が設定されます。もしていきたいと思い入れのverbosenessを実行時の安全性です。そのためのレベルを使用 ブ形式の図書館.
#include <iostream>
#include <iomanip>
#include <boost/format.hpp>
struct X
{ // this structure reverse engineered from
// example provided by 'Mikael Jansson' in order to make this a running example
char* name;
double mean;
int sample_count;
};
int main()
{
X stats[] = {{"Plop",5.6,2}};
// nonsense output, just to exemplify
// stdio version
fprintf(stderr, "at %p/%s: mean value %.3f of %4d samples\n",
stats, stats->name, stats->mean, stats->sample_count);
// iostream
std::cerr << "at " << (void*)stats << "/" << stats->name
<< ": mean value " << std::fixed << std::setprecision(3) << stats->mean
<< " of " << std::setw(4) << std::setfill(' ') << stats->sample_count
<< " samples\n";
// iostream with boost::format
std::cerr << boost::format("at %p/%s: mean value %.3f of %4d samples\n")
% stats % stats->name % stats->mean % stats->sample_count;
}
他のヒント
こちらの詳細.
考えのiostreamを構築しているようなのもうな入力は、c言語ではscanf):
// nonsense output, just to examplify
fprintf(stderr, "at %p/%s: mean value %.3f of %4d samples\n",
stats, stats->name, stats->mean, stats->sample_count);
う必要のようなもの:
std::cerr << "at " << static_cast<void*>(stats) << "/" << stats->name
<< ": mean value " << std::precision(3) << stats->mean
<< " of " << std::width(4) << std::fill(' ') << stats->sample_count
<< " samples " << std::endl;
文字列のフォーマットである場合にはオブジェクトorientednessで、あるべき姿sidesteppedるフォーマットDSL埋め込み文字列です。考えるLispの format
, Pythonのprintf-スタイルのフォーマットは、PHP、Bash、Perl、Ruby、その文字列intrapolation.
iostream
その利用の場合は、誤ったです。
の ブ形式の図書館 タイプ-安全なオブジェクト指向の代替printf式の文字列のフォーマットでの補完iostreamsないが、通常のレベルの問題により、賢く利用してオペレータ%.お薦めで考えることに専用の平Cのprintf場合は嫌いでフォーマットiostreamのオペレーター<<.
の悪い日にはC++の基準委員会保mucking約の言語iostreamsした移動目標です。ご利用いただいていたお客様iostreamsは、また次の機会に書き換えパーツなヘルプオーサリング-ツール毎にくいです。このため、私は常に使用されていstdioることにな大きく変化して1989年.
だったということでも今日は、利用iostreams.
の場合のようにできているかの確認を行います。たC前後でのC++、stdio図書館も自然です。賛否両論あるところのためのiostream前stdioがんを見逃printf()使用時iostream.
原則として混雑して待たされることiostreams、実際にはいく形式の部で"年"、小数部で"などとiostreamsも読みを使用していますのでstdio.ブー::フォーマットの改善、なかなかないきがあります。実際には、stdioほぼtypesafe以降で最も近代的なコンパイラでコンパイルな引数をチェック。
この地域がまだあなたの幸せのソリューション。
バイナリー IOを使うのstdioのfreadとfwrite.のための形式のものまで通常使用IOストリームがどの頃、非trival(デフォルト以外?) フォーマットですピ.
いるのが主流での図書館からのC++の標準図書館があります。
なんかを使用C-style-書式文字列に基づく文字列処理ルーチンのC++.
幾つかの理由が存在するmitその利用
- なtypesafe
- できないパス非POD種類のvariadic引数リスト、なうな入力は、c言語ではscanf+co., もprintf+式 またはこの暗黒の拠点で未定義の動作
- 簡単に思っていたが、あるきっかけで
- まなければならないフォーマット文字列の値を引数リスト"に同期
- を保持する必要があド 正しく
微妙なバグが導入されたリモートの場所
だけではなくprintf自体は良くない。ソフトウェアが齢を整理-改質やエラーが導入から遠く離れた場所にいと
.
// foo.h
...
float foo;
...
とどこか---
// bar/frob/42/icetea.cpp
...
scanf ("%f", &foo);
...
やの人気数値と半年後の人表するとともに、fooきのいくつかのカスタムタイプ---
// foo.h
...
FixedPoint foo;
...
がどこか---
// bar/frob/42/icetea.cpp
...
scanf ("%f", &foo);
...
...そして古いprintf/うな入力は、c言語ではscanfまとめ、現在の取得ランダムsegfaultsられないときには、いくつかの思いかがでしょうか。
レベルのiostreams
たくさんprintf()はデフォルト値が設定され、その後ある一定の確率を使わない自iostreamのです。例:
printf ("My Matrix: %f %f %f %f\n"
" %f %f %f %f\n"
" %f %f %f %f\n"
" %f %f %f %f\n",
mat(0,0), mat(0,1), mat(0,2), mat(0,3),
mat(1,0), mat(1,1), mat(1,2), mat(1,3),
mat(2,0), mat(2,1), mat(2,2), mat(2,3),
mat(3,0), mat(3,1), mat(3,2), mat(3,3));
を比較することをiostreams右:
cout << mat << '\n';
定義する適切な過負荷のためのオペレーター<< すると、別の構造をprintf-ブツが、有意差はないものの再使用およびtypesafe;もちろんまっていたのに、再使用できるprintf-好きなものを探してprintf(えに交換すればマトリクス会員新 FixedPoint
?), ほかその他の非trivialitiesなどに合格しなければなりませんファイル*取り扱う。
Cスタイルのフォーマット文字列はないよI18Nよiostreams
この形式の文字列がっているの救済国際化、それなりiostreamこれに関して:
printf ("Guten Morgen, Sie sind %f Meter groß und haben %d Kinder",
someFloat, someInt);
printf ("Good morning, you have %d children and your height is %f meters",
someFloat, someInt); // Note: Position changed.
// ^^ not the best example, but different languages have generally different
// order of "variables"
にて、 古いスタイルCフォーマット文字列が位置情報などiostreamsいます。
も考えておいた方がよいでしょう ブー::フォーマット, ルの支援を記載した位置にフォーマット文字列を明確にした。からその例:
cout << format("%1% %2% %3% %2% %1% \n") % "11" % "22" % "333"; // 'simple' style.
一部のprintf実装を提供位置引数が非標準装備。
ばいい ない 使用C-スタイルフォーマット文字列?
ほかに性能が指摘するようにJan Hudec),きというものはないと思い理由です。さま、ありがとうございました点にご留意ください。
"これを忘れるほど小さな効率は、約97%の時間:早期の最適化の根源ですよねいすべきではないに過ぎませ当社の機会が重要な3%.良いプログラマでないlulledに自己満足などが考えた方が賢くの重要なコードあるコードを識別"-Knuth
や
"ボトルネックが意外な所にいくにも、スピードハッキングまで実績のあることになるが、ボトルネックです。" -パイク
あり、printf実装は、通常よりも早くiostreamsは、通常よりも早く向上::フォーマット(小さなものから、特定のベンチマークに書いたもので大きく依存する状況を特定:場合はprintf=100%で、そのiostream=160%-ブ::フォーマット=220%)
な盲目的を省略するかを考える:どのくらい時間 本当に りテキスト処理どのようなプログラムが実行終了する前に?あるすべてをCスタイルのフォーマット文字列、ゆったりタイプの安全減refactorbility, 増加率は非常に微妙なバグを非表示に何年ものみるう権利 おりお客様ですか?
個人的にはかな下落ができない利得以上20%短縮.でも私は応用 過ごすほとんどの時間に他の作業以外の文字列処理のことはありませんでした。一部のパーサ 書いたお過ごし、ほぼすべての時間の文字列処理、その合計ランタイムすることができま なの試験と検証。
一部の謎
最後に、そういったプリセットの一部で乗り:
すべての誤差がコンパイラのない(たのでまたのは嬉しい):
shared_ptr<float> f(new float);
fscanf (stdout, "%u %s %f", f)
とにかく何が悪いのかということ。
const char *output = "in total, the thing is 50%"
"feature complete";
printf (output);
がありますが特典をたくさんのC++iostreams API、大きな課題の一つであはははi18n.問題は、実用に供するためにパラメータを置換できる異なる文化です。その典型というように:
// i18n UNSAFE
std::cout << "Dear " << name.given << ' ' << name.family << std::endl;
ながら動作するために、英語、中国語、家族の名前です。
での翻訳コードのための海外市場では、翻訳のスニペットが危険を孕んで新l10nsの変更が必要な場合もあるコードだけでなく異なる文字列です。
ブー::フォーマットのように組み合わせて最高のstdio(シングルフォーマット文字列を使用できるパラメータの違い、その順番になることiostreams(タイプ-安全性、拡張性).
使っていiostreamsは、主にこすと、怒ストリームを後にする場合をいう。たとえば、見出しを表示するかどうかを出力の一部の微量ウィンドウますが、比較的簡単なcoutとcerr.でき、コース、怒配管もunixではないとしました。
い愛printfようなフォーマット、通常フォーマット文字列を送信するバッファです。とQtとしての利用 QString::sprintf (ながの使用をお勧めし QString::arg その代わり私た が進みました。形式 でもなんの構文とともに多くの%'s)ただで見なかった。
うん、iolibrariesの形式入力します。
iostreamsはエクスペディアに複製するうな入力は、c言語ではscanf()も向上させ、必要な拡張のために入力します。
stdioはより良い読書のバイナリファイル(freadingブロックへのベクトル<unsigned char=""> びます。リサイズ()など)。のread_rest機能ファイルです。hhに http://nuwen.net/libnuwen.html のための一例です。
C++流できるチョーク上に多くのバイトを読み込み時にバイナリファイルがfalseの場合eof.
以来、iostreamsとなっており、標準を使用しているわけにはコードが働くと新しいバージョンのコンパイラです。思う今日では多くのコンパイラも知約iostreamsは、べきではないので問題を使用します。
だいたい場合にこだわる*printfの機能が問題ないと思います。