C++詳細に注目-標準IOライブラリ


IOオペレーションには、異なるタイプのデバイスおよび異なるタイプのデータをサポートするインタフェースが必要である.したがって、IO標準ライブラリは、継承を使用してオブジェクト向けのクラスのセットを定義します.
1.まずIOタイプを3つのヘッダファイルで定義する
iostreamはウィンドウの読み書きを制御するタイプを定義し、fstreamは名前付きファイルの読み書きを定義し、sstringはメモリにstringオブジェクトを定義します(これはACMの多くの問題をするときに便利ですが、これは後述します).統合関係にマルチステートの特性(ダイナミックバインド)を加えるため、istream&すなわちistreamの参照を使用してパラメータとして使用することができます.これにより、istreamオブジェクトを使用して実パラメータを作成することも、ifstreamオブジェクトとistringstreamオブジェクトを使用して実パラメータを作成することもできます.ostream&参照タイプと同様に、ここでは説明しません.
本人csdnブログへようこそ:http://blog.csdn.net/IAccepted
2.IOオブジェクトは複製または付与できない
理由:コピーできない理由は、IOオブジェクトのコピーコンストラクション関数がプライベートであることです.
結果:
1).レプリケーションをサポートする要素タイプのみがvectorまたは他のコンテナに格納できます.ストリームオブジェクトがレプリケーションできないため、ストリームオブジェクトはコンテナに格納できません.
2).パラメータまたは戻りタイプもストリームオブジェクトではありません.
なぜなら、ストリームクラスのレプリケーションコンストラクタはプライベートであり、呼び出されないためです.パラメータまたは戻り値がオブジェクトタイプの場合、オブジェクトのレプリケーションコンストラクタを呼び出してオブジェクトのコピーを行うことが知られています.
IOオブジェクトを渡したり戻したりする必要がある場合は、そのオブジェクトのポインタや参照のみを渡したり戻したりする必要があります.
本人csdnブログへようこそ:http://blog.csdn.net/IAccepted
3.出力バッファ管理
各IOオブジェクトは、プログラムの読み書きデータを格納するバッファを管理する.通常、バッファの内容がリフレッシュされる(すなわち、実際の出力デバイスまたはファイルに書き込まれる)場合は、次のような場合があります.
1).プログラムは正常に終了しました.main戻り作業の一部として、すべての出力バッファが空になります.
2).バッファがいっぱいになると、バッファは次の値を書き込む前にリフレッシュされます.
3).プログラマは自分でリフレッシュを表示します.これは特定のオペレータに依存し、通常endlを使用します.
4).出力ストリームを入力ストリームに関連付けます.これにより、読み込み時に関連付けられた出力バッファがリフレッシュされます.
4.ファイルの入出力
初期のC言語の理由は、IO標準ライブラリがC++スタイルのstring文字列ではなくC言語スタイルのstring文字列をファイル名として使用していたため、通常はstringタイプの文字列がc_を呼び出すことによってstrタイプをCスタイル文字列に変換してファイルを開きます.
1).ファイルを開いた後、ファイルを開いた状態を検出する良い習慣を身につけなければなりません.
2).1つのストリームで複数のファイルを操作する場合は、必ずファイルストリームの状態をクリアしてclear()メソッドを呼び出します.ストリームを閉じると、ストリームオブジェクトの内部状態を変更することはできません.1回の読み書き操作に失敗した場合、ストリームオブジェクトを閉じてから開いても、前回保持したエラー状態を回避することはできません.clear()を呼び出して、このエラー状態をクリアする必要があります.
3).ファイルモードは、ストリームのプロパティではなく、ファイルのプロパティにすぎません.ofstream::app ofstream::in ofstream::outなど.
5.文字ストリーム
ACMでは、行全体に1つの文を読み込んで単語ごとに処理する問題があります.このとき、文字ストリームは操作をかなり簡単にします.
例えば杭電OJ 2072、コードは以下の通り、istringstreamを使用すると便利です.
#include <iostream>
#include <set>
#include <sstream>
#include<string.h>
using namespace std;
int main()
{
	string ss;
	while(getline(cin,ss) && ss!="#")
	{
		istringstream stream(ss);
		set<string> s; //    ,       
		string word;
		while(stream >>word)
		{
			s.insert(word);
		}
		cout<<s.size()<<endl;
	}
	return 0;
}

本人csdnブログへようこそ:http://blog.csdn.net/IAccepted