Cplusplus-cpp-files-streams

提供:Dev Guides
移動先:案内検索

C ++ファイルとストリーム

これまで、 iostream 標準ライブラリを使用してきました。これは、それぞれ標準入力からの読み取りと標準出力への書き込みのための cin および cout メソッドを提供します。

このチュートリアルでは、ファイルの読み取りおよび書き込み方法について説明します。 これには、3つの新しいデータ型を定義する fstream という別の標準C ++ライブラリが必要です-

Sr.No Data Type & Description
1

ofstream

このデータ型は出力ファイルストリームを表し、ファイルの作成およびファイルへの情報の書き込みに使用されます。

2

ifstream

このデータ型は入力ファイルストリームを表し、ファイルから情報を読み取るために使用されます。

3

fstream

このデータ型は一般にファイルストリームを表し、ofstreamとifstreamの両方の機能を備えています。つまり、ファイルを作成し、ファイルに情報を書き込み、ファイルから情報を読み取ることができます。

C でファイル処理を実行するには、ヘッダーファイル<iostream>および<fstream>をC ソースファイルに含める必要があります。

ファイルを開く

ファイルは、読み取りまたは書き込みを行う前に開く必要があります。 ofstream または fstream オブジェクトを使用して、ファイルを書き込み用に開くことができます。 また、ifstreamオブジェクトは、読み取り専用のファイルを開くために使用されます。

以下は、fstream、ifstream、およびofstreamオブジェクトのメンバーであるopen()関数の標準構文です。

void open(const char *filename, ios::openmode mode);

ここで、最初の引数は開くファイルの名前と場所を指定し、* open()*メンバー関数の2番目の引数はファイルを開くモードを定義します。

Sr.No Mode Flag & Description
1

ios::app

追加モード。 そのファイルへのすべての出力は、末尾に追加されます。

2

ios::ate

出力用のファイルを開き、読み取り/書き込みコントロールをファイルの最後に移動します。

3

ios::in

読み取り用にファイルを開きます。

4

ios::out

書き込み用にファイルを開きます。

5

ios::trunc

ファイルが既に存在する場合、ファイルを開く前にその内容は切り捨てられます。

これらの値を2つ以上組み合わせるには、* OR *を組み合わせます。 たとえば、書き込みモードでファイルを開き、既に存在する場合に切り捨てたい場合は、次の構文になります-

ofstream outfile;
outfile.open("file.dat", ios::out | ios::trunc );

同様に、次のように目的の読み取りおよび書き込み用にファイルを開くことができます-

fstream  afile;
afile.open("file.dat", ios::out | ios::in );

ファイルを閉じる

C ++プログラムが終了すると、すべてのストリームが自動的にフラッシュされ、割り当てられたすべてのメモリが解放され、開いているすべてのファイルが閉じられます。 ただし、プログラマーは、プログラムを終了する前に、開いているすべてのファイルを閉じることをお勧めします。

以下は、fstream、ifstream、およびofstreamオブジェクトのメンバーであるclose()関数の標準構文です。

void close();

ファイルへの書き込み

C ++プログラミングの実行中に、ストリーム挿入演算子(<<)を使用してプログラムからファイルに情報を書き込みます。その演算子を使用して画面に情報を出力します。 唯一の違いは、 cout オブジェクトの代わりに ofstream または fstream オブジェクトを使用することです。

ファイルからの読み取り

ストリーム抽出演算子(>>)を使用して、キーボードから情報を入力するのと同じように、ファイルから情報をプログラムに読み込みます。 唯一の違いは、 cin オブジェクトの代わりに ifstream または fstream オブジェクトを使用することです。

読み取りおよび書き込みの例

以下は、ファイルを読み取りおよび書き込みモードで開くC ++プログラムです。 ユーザーが入力した情報をafile.datという名前のファイルに書き込んだ後、プログラムはファイルから情報を読み取り、画面に出力します-

#include <fstream>
#include <iostream>
using namespace std;

int main () {
   char data[100];

  //open a file in write mode.
   ofstream outfile;
   outfile.open("afile.dat");

   cout << "Writing to the file" << endl;
   cout << "Enter your name: ";
   cin.getline(data, 100);

  //write inputted data into the file.
   outfile << data << endl;

   cout << "Enter your age: ";
   cin >> data;
   cin.ignore();

  //again write inputted data into the file.
   outfile << data << endl;

  //close the opened file.
   outfile.close();

  //open a file in read mode.
   ifstream infile;
   infile.open("afile.dat");

   cout << "Reading from the file" << endl;
   infile >> data;

  //write the data at the screen.
   cout << data << endl;

  //again read the data from the file and display it.
   infile >> data;
   cout << data << endl;

  //close the opened file.
   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()関数や、前のreadステートメントで残った余分な文字を無視するignore()関数など、cinオブジェクトの追加関数を使用します。

ファイル位置ポインター

*istream* と *ostream* の両方が、ファイル位置ポインターを再配置するためのメンバー関数を提供します。 これらのメンバー関数は、istreamでは *seekg* ( "seek get")、ostreamでは *seekp* ( "seek put")です。
seekgとseekpの引数は通常、長整数です。 シークの方向を示すために、2番目の引数を指定できます。 シーク方向は、ストリームの先頭を基準とした位置決めの場合は *ios
beg* (デフォルト)、ストリームの現在の位置を基準とした位置決めの場合は ios :: cur 、位置決めの場合は ios :: end になります。ストリームの終わりを基準にします。

ファイル位置ポインターは整数値で、ファイルの開始位置からのバイト数としてファイル内の位置を指定します。 「get」ファイル位置ポインタの配置のいくつかの例は次のとおりです-

//position to the nth byte of fileObject (assumes ios::beg)
fileObject.seekg( n );

//position n bytes forward in fileObject
fileObject.seekg( n, ios::cur );

//position n bytes back from end of fileObject
fileObject.seekg( n, ios::end );

//position at end of fileObject
fileObject.seekg( 0, ios::end );