1.3.01_C++ファイルとストリーム

4113 ワード

これまでiostream標準ライブラリを使用してきましたが、cinメソッドとcoutメソッドを使用して、標準入力からストリームを読み出し、標準出力へストリームを書き込むことができます.
このチュートリアルでは、ファイルからストリームを読み込み、ファイルにストリームを書き込む方法について説明します.これは、3つの新しいデータ型を定義するC++の別の標準ライブラリfstreamを使用する必要があります.
  • ofstreamこのデータ型は、ファイルを作成し、ファイルに情報を書き込むための出力ファイルストリームを表す.
  • ifstreamこのデータ型は、ファイルから情報を読み出すための入力ファイルストリームを表す.
  • fstreamこのデータ型は、通常、ファイルストリームを表し、ofstreamとifstreamの2つの機能を同時に備えています.これは、ファイルを作成し、ファイルに情報を書き込み、ファイルから情報を読み出すことができることを意味します.

  • C++でファイル処理を行うには、C++ソースファイルにヘッダファイルとを含める必要があります.
    ファイルを開く
    ファイルから情報を読み込むか、ファイルに情報を書き込む前に、ファイルを開く必要があります.ofstreamオブジェクトとfstreamオブジェクトは、ファイルを開いて書き込み操作を行うために使用できます.ファイルを開いて読み取り操作を行う必要がある場合はifstreamオブジェクトを使用します.
    次はopen()関数の標準構文です.open()関数はfstream、ifstream、ofstreamオブジェクトのメンバーです.
    void open(const char *filename, ios::openmode mode);
    

    ここでopen()メンバー関数の第1のパラメータは、開くファイルの名前と場所を指定し、第2のパラメータはファイルが開くモードを定義します.
    モードフラグ|説明--|ios::app|追加モード.すべての書き込みがファイルの最後に追加されます.ios::ate|ファイルを開いてファイルの末尾にナビゲートします.ios::in|読み取り用にファイルを開きます.ios::out|書き込み用にファイルを開きます.ios::trunc|ファイルがすでに存在する場合、その内容はファイルを開く前に遮断され、すなわちファイル長を0に設定されます.
    以上の2つ以上のモードを組み合わせて使用できます.たとえば、書き込みモードでファイルを開き、ファイルが存在しないようにファイルを切断する場合は、次の構文を使用します.
    ofstream outfile;
    outfile.open("file.dat", ios::out | ios::trunc );
    

    同様に、読み書き用のファイルを開くには、次の構文を使用します.
    fstream  afile;
    afile.open("file.dat", ios::out | ios::in );
    

    ファイルを閉じる
    C++プログラムが終了すると、すべてのストリームのリフレッシュが自動的に閉じられ、割り当てられたメモリがすべて解放され、開いているすべてのファイルが閉じられます.しかし、プログラマーはプログラムが終了する前に開いているすべてのファイルを閉じる良い習慣を身につけなければならない.
    次はclose()関数の標準構文です.close()関数はfstream、ifstream、ofstreamオブジェクトのメンバーです.
    void close();
    

    ファイルの書き込み
    C++プログラミングでは、画面に出力するように、ストリーム挿入演算子(<<)を使用してファイルに情報を書き込みます.唯一の違いは、coutオブジェクトではなくofstreamまたはfstreamオブジェクトを使用することです.
    ファイルの読み込み
    C++プログラミングでは、キーボードから情報を入力するように、ストリーム抽出演算子(>>)を使用してファイルから情報を読み出します.唯一の違いは、cinオブジェクトではなくifstreamまたはfstreamオブジェクトを使用することです.
    インスタンスの読み込み&書き込み
    次のC++プログラムは読み書きモードでファイルを開きます.ファイルへdatユーザが入力した情報を書き込むと、プログラムはファイルから情報を読み出し、画面に出力する:インスタンス
    #include 
    #include 
    using namespace std;
     
    int main ()
    {
        
       char data[100];
     
       //         
       ofstream outfile;
       outfile.open("afile.dat");
     
       cout << "Writing to the file" << endl;
       cout << "Enter your name: "; 
       cin.getline(data, 100);
     
       //             
       outfile << data << endl;
     
       cout << "Enter your age: "; 
       cin >> data;
       cin.ignore();
       
       //               
       outfile << data << endl;
     
       //        
       outfile.close();
     
       //         
       ifstream infile; 
       infile.open("afile.dat"); 
     
       cout << "Reading from the file" << endl; 
       infile >> data; 
     
       //         
       cout << data << endl;
       
       //          ,    
       infile >> data; 
       cout << data << endl; 
     
       //        
       infile.close();
     
       return 0;
    }
    

    上記のコードがコンパイルおよび実行されると、次の入力および出力が生成されます.
    $./a.out
    Writing to the file
    Enter your name: Zara
    Enter your age: 9
    Reading from the file
    Zara
    9
    

    上記の例では、getline()関数などのcinオブジェクトの追加関数が外部から1行読み込まれ、ignore()関数は、前に読んだ文に残った余分な文字を無視します.
    ファイル位置ポインタ
    istreamとostreamは、ファイルの場所ポインタを再配置するためのメンバー関数を提供します.これらのメンバー関数には、istreamに関するseekg(「seek get」)とostreamに関するseekp(「seek put」)が含まれます.
  • seekgおよびseekpのパラメータは、通常、長整数である.2番目のパラメータは、検索方向を指定するために使用できます.
  • 検索方向はios::beg(デフォルトでは、ストリームの先頭から位置決め)、ios::cur(ストリームの現在位置から位置決め)、ios::end(ストリームの末尾から位置決め)であってもよい.
  • ファイル位置ポインタは、ファイルの開始位置からポインタの位置までのバイト数を指定する整数値です.

  • 次に、getファイルの位置ポインタを位置決めする例を示します.
    //     fileObject    n    (    ios::beg)
    fileObject.seekg( n );
     
    //          fileObject         n    
    fileObject.seekg( n, ios::cur );
     
    //          fileObject       n    
    fileObject.seekg( n, ios::end );
     
    //     fileObject    
    fileObject.seekg( 0, ios::end );
    

    コードリンク:https://github.com/karst87/cpp/tree/master/learning/com.runoob