C ++のファイルとストリーム
これまでのところ、我々は、CINとCOUTのストリーム方法は、標準入力から読み込み、標準出力ストリームに書き込むために使用されている提供し、標準のiostreamライブラリを、使用しています。
このチュートリアルでは、ファイルをストリーミングするストリームからファイルを読み書きする方法を示しています。 別のC ++標準ライブラリのfstreamが、それは3新しいデータ型を定義するところです。
数据类型 | 描述 |
---|---|
ofstream | 该数据类型表示输出文件流,用于创建文件并向文件写入信息。 |
ifstream | 该数据类型表示输入文件流,用于从文件读取信息。 |
fstream | 该数据类型通常表示文件流,且同时具有 ofstream 和 ifstream 两种功能,这意味着它可以创建文件,向文件写入信息,从文件读取信息。 |
C ++での取り扱い提出するには、C ++ソース・コード・ファイル<iostreamの>と<fstreamの>のヘッダファイルをインクルードする必要があります。
ファイルをオープンします
ファイルへのファイルから情報を読み取るまたは書き込みには、最初にファイルを開く必要があります。ofstreamのとfstreamのオブジェクトは、あなただけの、読み取りのためにファイルを開くはifstreamオブジェクトを使用する必要がある場合、書き込み用にファイルを開くために使用することができます。
ここで、open()関数は、標準的な構文は、open()関数でfstream、はifstreamやofstreamのオブジェクトのメンバーです。
void open(const char *filename, ios::openmode mode);
ここでは、最初のパラメータのオープン()メンバ関数は、開きたいファイルの名前と場所を指定し、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 ++プログラムが終了すると、自動的にオフにすべてのストリームを更新し、すべての割り当てられたメモリを解放し、開いているファイルをすべて閉じます。 プログラムはすべて閉じて開いているファイルを終了する前に、しかし、プログラマは、良い習慣を開発する必要があります。
ここでクローズ()関数は、標準的な構文は、クローズ()関数でfstream、はifstreamやofstreamのオブジェクトのメンバーです。
void close();
ファイルへの書き込み
C ++プログラミングでは、私たちは、同じ画面上でオペレータへの出力情報を用いて、同様に、ファイルに情報を書き込むためのストリーム挿入演算子(<<)を使用します。 唯一の違いはここにあなたがofstreamのかfstreamのオブジェクトの代わりに、coutのオブジェクトを使用していることです。
ファイルを読みます
C ++プログラミングでは、私たちは、キーボードからのオペレータ入力情報を使用してのように、ファイルから情報を読み取るために(>>)ストリーム抽出演算子を使用します。 唯一の違いはここにあなたがfstreamのかはifstreamオブジェクトの代わりに、CINオブジェクトを使用していることです。
例を読む&書きます
読み書きモードでファイルを開くには、次の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
上記の例は、このようなのgetline()関数として、付加機能のcinオブジェクトを使用して余分な文字は無視されているうち離れる前の文を読み取ります()関数を無視し、外部からの行を読み込みます。
ファイル位置ポインタ
istreamとostreamのは、ファイルポインタの位置を再配置するためのメンバ関数を提供します。これらは、(「入れシーク」)(「ゲットシーク」)とのostreamのseekpにseekgのはistreamメンバ関数について含まれます。
引数をseekgとseekp通常長整数です。 第2のパラメータは、検索の方向を指定するために使用することができます。 検索する方向は、それはイオス:: CUR(ストリームの現在位置から位置決め )することができ、開始されたストリームの終わりからイオス::エンド(することができます(ストリームの先頭から配置するデフォルト、)イオス::請うことができます位置決め)。
ファイル位置ポインタはポインタの位置にファイルの先頭からのバイト数を指定する整数値です。 ここで、「取得」ファイル位置ポインタインスタンスをターゲットにしています。
// 定位到 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 );