C++off streamとifstreamの詳しい使い方


C++の中には、streamという種類があります。すべてのI/Oはこの「ストリーム」の種類をベースにしています。私たちが認識するファイルI/Oを含めて、streamという種類には2つの重要な演算子があります。例えば、システムにはデフォルトの標準出力ストリームがあります。一般的にはディスプレイのことを指しています。だから、cout<<「Write Stdout」><';文字列「Write Stdout」と改行文字(')を標準出力ストリームに出力することを表します。2、シーケンサ(>)はストリームからデータを入力します。例えば、システムにはデフォルトの標準入力ストリームがあります。一般的にはキーボードを指すので、cin>>>xです。標準入力ストリームから指定タイプ(すなわち変数xのタイプ)を読み出すデータを表します。C++の中では、ファイルの操作はstreamのサブクラスfstreamによって実現されるので、このようにファイルを操作するには、頭ファイルfstream.hに参加しなければなりません。以下はこのような書類の操作過程を一つずつ紹介します。一、ファイルを開くfstreamクラスでは、メンバー関数open()があります。ファイルを開くために使用されています。その原型はvoid open(const char*filename、int mode、int access)です。パラメータ:filename:開くファイル名mode:ファイルを開く方式access:ファイルの属性を開くファイルを開く方法はクラスios(すべてのストリームI/Oクラスのベース)で定義されています。一般的な値は以下の通りです。ios:app:ファイルを追加で開くと、ファイルの最後に位置します。ios:appはこの属性が含まれています。前の文ios:in:ファイルは入力で開く(ファイルデータはメモリに入力する)ios:out:ファイルは出力で開く(メモリデータはファイルに出力する)ios:nocreate:ファイルを作成しないので、ファイルが存在しない時は開けません。ファイルを開くときにファイルが失敗したらios:trunc:ファイルが存在する場合は、ファイル長を0に設定し、上記の属性をios:out|ios:binaryでファイルを開く属性の値は:0:普通ファイル、アクセス1:読み取り専用ファイル2:隠しファイル4:システムファイルは、「または」または「+」で上記の属性を接続できます。例えば、3または1|2は読み取り専用と隠し属性でファイルを開きます。例えば、ファイルc:\config.sys fstream file 1をバイナリ入力で開く。file 1.open(「c:\config.sys」、ios:binary ios:in,0);open関数がファイル名のパラメータしかない場合は、通常のファイルを読み/書きます。すなわち、file 1.open(「c:\config.sys」)<=>file 1.open(「c:\config.sys」、ios:in|ios::out、0)また、fstreamにはopen()と同じ構造関数があり、上記の例では定義の際にファイルを開くことができます。fstream file 1(「c:\config.sys」)。特に、fstreamは2つのサブクラスがあります。ifstreamとoff stream、ifstreamはデフォルトでは入力でファイルを開きますが、Offreamはデフォルトでは出力でファイルを開きます。ifstream file 2(「c:\pdos.def」)//ファイルostream file 3を入力で開きます。出力でファイルを開くので、実際のアプリケーションでは必要に応じて異なるクラスを選んで定義します。出力で開きたいなら、Ostreamで定義します。入出力方式で開きたいなら、fstreamで定義します。二、ファイルを閉じて開いているファイルの使用が完了したら必ずクローズします。fstreamはメンバー関数close()を提供してこの操作を完成します。file 1に接続されているファイルを閉じます。三、読み書きファイルはテキストファイルとバイナリファイルの読み取りに分けられています。テキストファイルの読み取りは比較的簡単で、挿入器とシーケンサを使えばいいです。この2つの方法を詳しく紹介します。1、テキストファイルの読み書きは簡単です。挿入器(<)でファイルに出力します。解析器(>)でファイルから入力します。file 1は入力で開くと仮定し、file 2は出力で開く。例は、file 2<「I Love You」;/文字列「I Love You」int iをファイルに書き込む。file 1>>>i;//ファイルから整数値を入力します。このような方式は出力を16進に指定できるなど、簡単なフォーマット能力もあります。具体的なフォーマットには以下の操作子機能があります。入力/出力decは十進数の数値データ入力と出力endlに改行符を出力し、このストリーム出力endsが空文字出力を更新します。hexは16進数のデータ入力と出力のoctを8進数の数値データ入力と出力にフォーマットします。setpxecision(int p)浮動小数点数の精度ビット出力を設定します。例えば123を16進出力として扱います。file 1<2、バイナリファイルの読み書き①put()関数は一つの文字をストリームに書き込みます。元のモデルはostream&put(char ch)です。使用も簡単です。流れに文字'c'を書くことです。②get()get()関数は比較的柔軟で、3つのよく使われている重載形態があります。一つはput()に対応する形です。ifstream&get(char&ch);機能は、ストリームから文字を読み取り、結果は参照chに保存され、ファイルの最後になると空の文字を返します。file 2.get(x)のようには、ファイルから文字を読み取り、読み取った文字をxに保存することを示します。もう一つの重荷重形式の原型は、int get()である。この形式は、ストリームから文字を返し、ファイルの最後に到達すると、x=file 2.get()のようにEOFに戻ります。上記の機能と同じです。もう一つのモデルは、ifstream&get(char*buf、int num、char delim=');このような形式では、num個の文字を読み込んだりdelimで指定された文字に出会ったりするまで、bufで指定された配列に文字を読み込んだり、delimというパラメータを使用していない場合は、デフォルト値改行符'を使用します。例えば、file 2.get(str 1,127、'A')//ファイルから文字を読み出して文字列str 1に進み、文字'A'があったり、127文字が読み取られたら終了します。③データブロックを読み、バイナリデータブロックを書きます。メンバー関数read()とwrite()メンバー関数を使って、その原型は以下の通りです。read(unsigned char*buf,int num)write(const unsigned char*buf、int num);read()num個の文字をファイルからbuf向けのキャッシュに読み込むと、num個の文字が読み込まれていないときにファイルの最後になります。メンバー関数int gcount()が使えます。を選択します。write()は、bufから差すキャッシュにnum文字を書いてファイルに入るが、キャッシュのタイプはunsigned char*であり、場合によってはタイプ変換が必要であることがある。例:unsigned char str 1="I Love You"int n[5]ifstream in(「xxx.xxx」)off streamout(「yy.yy」);out.write(str 1、streen(str 1);文字列str 1をすべてyyy.yyの中でin. read((unsigned char*)n,sizeof(n))//xxx.xxxから指定の整数を読み出して、タイプ変換in.close()に注意する。out.close()四、EOFメンバー関数eof()を検出してファイルの最後に到達したかどうかを検出します。ファイルの最後に到達したら0以外の値を返します。そうでなければ0を返します。原型はint eof();例:if(in.eof()Show Message(「ファイルの最後に到達しました!」);五、ファイルの位置付けとCのファイルの操作方式が違っているのは、C++I/Oシステムが二つのファイルに関連するポインタを管理していることです。一つは読み取りポインタで、入力操作のファイル内の位置を説明します。もう一つは針を書くことです。今度は操作の位置を書きます。入出力を行うたびに、対応するポインタが自動的に変わります。したがって、C++のファイルの位置付けは読み取り位置と書き込み位置の位置付けに分かれており、対応するメンバー関数はseekg()とseekp()である。seekg()は読み取り位置を設定し、seekpは書き込み位置を設定します。それらの最も一般的な形式は以下の通りです。istream&seekg(stremoff offset、seek_dir origgin);オーストリア&seekp(stremoff offset、seek_dir origgin);stremoffはiostream.hに定義され、オフセット量offsetで取得できる最大値を定義します。seek_dirは移動の基準位置を表しています。以下の値があるエニュメレーションです。ios::beg:ファイルの先頭ios:cur:ファイルの現在位置ios::end:ファイルの最後の2つの関数は普通バイナリファイルに使われます。テキストファイルはシステムの文字解釈によって予想される値とは異なるかもしれません。例:file 1.seekg(1234,ios:cur)//ファイルの読み取りポインタを現在の位置から1234バイトfile 2.seekp(1234,ios:beg)//ファイルの書き込みポインタをファイルの先頭から1234バイト後ろに移動します。