今回はC++
ストリームについての紹介するぞい
第1回ではコンソール画面に出力するためにcoutというものを使った
実はこれはコンソール画面に出力するためのストリームです
。(`ω´#)。<ぇ?何それ
ストリームという概念をわかりやすく言えば
ファイル出力やらコンソール出力やらをひっくるめて
同じように扱いますよってことです。
C/C++やった人ならcoutよりprintfのが良いじゃんと
思う人が多いと思う
自分もそうだったけど
実はcoutのほうが汎用性あるのよー
というのはC++のcoutのほうが
ストリームという概念がしっかりしているということ
ポイントはストリームはクラスを使っているので
入出力対象の切り替えも柔軟にできる
つまりストリームオブジェクトを引数として与えて
差し替えてしまえばポリモーフィズムで
コンソールでもファイルでもなんでも対応できる
ファイルクローズみたいな
ストリームを閉じる処理もデストラクタがやってくれるので
明記する必要性がない
難しい理論述べるより
具体例みせちゃったほうが早いね
標準出力、ファイル出力をストリームを使って出力するコードを書くよ
#include <iostream>
#include <fstream>
using namespace std;
void Output(ostream& os){
os << "Hello World!" << endl;
}
int main(){
Output(cout);
ofstream ofs("test.txt");
Output(ofs);
return 0;
}
ofstreamクラスのコンストラクタで出力するファイルを指定します。
ファイルを閉じるfcloseみたいな処理は書かなくてもクラスのデストラクタで閉じてくれる。
(この辺も利点の1つ)
一見実にシンプルに見えるコードだけど
ここに実にいろいろな技術が隠されています
簡単に言ってしまえばostream型にキャストすると
まったく同じように出力できるということです。(ぉ
解説(いままでの全部理解してないとこの辺は難しいかもね):
coutとofstreamが一見違うように見えますが
実は辿ってみると
cout側はbasic_ostreamクラスに
ofstream型はbasic_ostreamクラスを継承したbasic_ofstreamクラスに
なっています。
coutはbasic_ostreamクラスのインスタンスです。
一方ofstreamクラスはbasic_ofstreamクラスであり、basic_ostreamクラスを継承しています。
またostreamとはbasic_ostreamをtypedefした(別名で同じ)ものなので
ostream型にキャストするとポリモーフィズムが働いて
出力先が違うけど
同じように共通の演算子<<などが使える
(演算子のオーバーロード)
内部的に隠蔽化されているおかげで
ストリームというのはどこにでも同じように入出力できるオブジェクトなのです。
それでもcoutが嫌われるのは
やっぱりマニュピレータによる整形がめんどくさいということなのだろうか?