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


これまで、私たちは iostream 標準ライブラリを使用してきました。これは、それぞれ標準入力からストリームを読み取り、標準出力にストリームを書き込むための cin メソッドと cout メソッドを提供します。

このチュートリアルでは、ファイルからストリームを読み取り、ファイルにストリームを書き込む方法を説明します。これには、C++ の別の標準ライブラリ fstream を使用する必要があります。これは、次の 3 つの新しいデータ型を定義します。ファイルを作成し、ファイルに情報を書き込みます。

ifstream このデータ型は入力ファイル ストリームを表し、ファイルから情報を読み取るために使用されます。 fstream このデータ型は通常、ファイル ストリームを表し、ofstream 関数と ifstream 関数の両方を備えています。つまり、ファイルの作成、ファイルへの情報の書き込み、ファイルからの情報の読み取りが可能です。 ファイルから情報を読み取ったり、ファイルに情報を書き込んだりするには、まずファイルを開く必要があります。 ofstreamfstreamifstream オブジェクトを使用します。
C++ でファイル処理を行うには、ヘッダー ファイル <iostream> と <fstream> が C++ ソース コード ファイルに含まれている必要があります。 ファイルを開く
オブジェクトと オブジェクトの両方を使用して、書き込み操作のためにファイルを開くことができます。読み取り操作のためにのみファイルを開く必要がある場合は、
以下は、fstream、ifstream、および ofstream オブジェクトのメンバーである open() 関数の標準構文です。

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

ここで、

open()

メンバー関数の最初のパラメータは、開かれるファイルの名前と場所を指定し、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++ プログラムは、読み取りおよび書き込みモードでファイルを開きます。ユーザーが入力した情報をファイル afile.dat に書き込んだ後、プログラムはファイルから情報を読み取り、画面に出力します:

#include <fstream>
#include <iostream>
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

上記の例では、cin オブジェクトの追加関数を使用しています。たとえば、getline() 関数は外部から行を読み取り、ignore() 関数は前の読み取りステートメントによって残された余分な文字を無視します。

ファイル ロケーション ポインター

istreamostream はどちらも、ファイル ロケーション ポインターを再配置するためのメンバー関数を提供します。これらのメンバー関数には、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 );