C++ファイルアクション:fstreamクラス

4467 ワード

#include//標準入出力ストリーム
#include//ifstreamとofstreamを含むiostreamから派生
using namespace std;//名前空間stdにあるので、付けるのを忘れないでください.
C++は、以下のクラスでファイルの入出力をサポートします(1)ofstream:書き込み操作、ファイルクラスの出力;(2)ifstream:読み取り操作、ファイルクラスの入力;(3)fstream:同時に読み書き可能なファイルクラス.
一、
ファイルを開く2つの方法:
1、変数を定義して開く
ifstream file (filename, ios::in|ios::binary|ios::ate);  

2、プログラムの途中で開く
ifstream in;  
...
in.open("example.cpp",ios::in);

いずれの方法もopen関数によって実現されます.
Open関数:ファイル関数のプロトタイプを開く:void open(const char*filename,int mode,int access);パラメータの説明:
Filename:開くファイル名mode:ファイルを開く方法access:ファイルのプロパティを開く方法クラスios(すべてのフローI/Oクラスのベースクラス)で定義され、ios::app:追加でファイルios::ate:ファイルを開いてファイルの最後にナビゲートします.ios:appには、このプロパティios::binary:ファイルをバイナリで開き、デフォルトではテキストで開きます.2つの方法の違いは、前文ios::in:ファイルを入力でios::out:ファイルを出力でios::nocreate:ファイルを作成しないため、ファイルが存在しない場合は失敗ios::noreplace:ファイルを上書きしないため、ファイルを開く場合は失敗ios::trunc:ファイルが存在する場合、ファイル長を0に設定すると、ios::out|ios::binaryがファイルを開くプロパティの値は:0:一般ファイル、開くアクセス1:読み取り専用ファイル2:隠しファイル4:システムファイル
ファイルが正常に開いたかどうかを判断
iftream mfile;
mfile.open(filepath,ios::in|ios::binary);
if(mfile.is_open())  
    cout<<"open success!"<<endl;

ファイルを閉じる
file.close();

二、
読み書きファイル読み書きファイルはテキストファイルとバイナリファイルの読み取りに分けられ、テキストファイルの読み取りは比較的簡単で、挿入器と解析器でいいです.バイナリの読み取りは複雑ですが、この2つの方法について詳しく説明します.
1、テキストファイルの読み書きテキストファイルの読み書きは簡単:挿入器(<<)でファイルに出力する;ファイルからプロセッサ(>>>)で入力します.file 1が入力で開くと仮定し、file 2が出力で開く.例は次のとおりです.
  file2<<"I Love You";//ファイルに文字列「I Love You」int iを書き込む.  file1>>i;//ファイルから整数値を入力します.
この方式には、出力を16進数に指定できるなど、簡単なフォーマット能力もあります.具体的なフォーマットは以下のとおりです.
マニピュレータ機能入出力decは、10進数数値データ入出力endlにフォーマットされ、1つの改行文字が出力され、このストリーム出力endsがリフレッシュされ、1つの空文字出力hexが16進数数値データにフォーマットされ、octが8進数数値にフォーマットされ、setpxecision(int p)が浮動小数点数を設定する精度ビット数出力が出力されます.
例えば123を16進数出力とする:file 1<
2、バイナリファイルの読み書き①put()関数はストリームに1文字を書き込み、その原型はofstream&put(char ch)であり、file 1のように使用も簡単である.put('c');ストリームに「c」という文字を書きます.
②get()get()関数は比較的柔軟で、3つのよく使われるリロード形式があります.
1つはput()に対応する形式:ifstream&get(char&ch);機能は、ストリームから文字を読み出し、結果を参照chに保存し、ファイルの最後に空の文字を返すことです.例えばfile 2.get(x);ファイルから1文字を読み出し、読み出した文字をxに保存することを示す.
もう1つのリロード形式のプロトタイプはint get();この形式は、ストリームから1文字を返し、ファイルの最後に達するとx=file 2のようなEOFを返す.get();前例の機能と同じです.
もう一つの形式の原型はifstream&get(char*buf,int num,char delim=');この形式では、num文字が読み込まれたりdelimで指定された文字に遭遇したりするまでbufが指す配列に文字を読み込み、delimというパラメータを使用しない場合はデフォルト値の改行文字''を使用します.例:
  file2.get(str1,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 str1[]="I Love You";
    int n[5];
    ifstream in("xxx.xxx");
    ofstream out("yyy.yyy");
    out.write(str1,strlen(str1));//    str1    yyy.yyy 
    in.read((unsigned char*)n,sizeof(int));// xxx.xxx        ,      
    in.close();out.close();

三、
EOFメンバー関数eof()を検出すると、ファイルの末尾に到達するかどうかを検出し、ファイルの末尾に到達すると0以外の値を返すと、0を返します.プロトタイプはint eof()である.
例:
if(in.eof())ShowMessage("       !");

四、
ファイルの配置とCのファイルの操作方式は異なって、C++I/Oシステムは2つの1つのファイルと連絡するポインタを管理します.1つは、入力操作がファイル内の位置を示す読み取りポインタです.もう1つは書き込みポインタで、次回の書き込み操作の位置です.入力または出力が実行されるたびに、対応するポインタが自動的に変化します.したがって、C++のファイルの位置付けは、読み取り位置と書き込み位置の位置付けに分けられ、対応するメンバー関数はseekg()とseekp()であり、seekg()は読み取り位置、seekpは書き込み位置の設定である.最も一般的な形式は次のとおりです.
    istream &seekg(streamoff offset,seek_dir origin);     ostream &seekp(streamoff offset,seek_dir origin);
streamoffはiostreamに定義されています.hでは、オフセットoffsetで取得できる最大値を定義し、seek_dirは移動の基準位置を表し、以下の値の列挙である.
ios::beg:ファイル先頭ios::cur:ファイル現在位置ios::end:ファイル末尾の2つの関数は、テキストファイルが文字の解釈によって予想される値と異なる可能性があるため、バイナリファイルに一般的に使用されます.offsetは正数が順方向オフセット、負数が負方向オフセット
例:
file1.seekg(1234,ios::cur);//               1234   
file2.seekp(1234,ios::beg);//               1234