C++でクラスオブジェクトをファイルに読み書きする方法(fstreamの使い方)
C++の標準入出力ライブラリ「iostream」には、標準入力からデータを受け取るcinと、標準出力へデータを出力するcoutという2つのストリームが用意されています。本記事では、ファイルからクラスオブジェクトへデータを読み込む方法、およびクラスオブジェクトのデータをファイルへ書き出す方法について解説します。
ファイルの読み書きを行うには、もう一つの標準ライブラリ<fstream>を使用します。fstreamライブラリの主要な3つのデータ型は以下の通りです。
- ifstream:入力ファイルストリームを表し、ファイルから情報を読み込みます。
- ofstream:出力ファイルストリームを表し、ファイルへ情報を書き込みます。
- fstream:汎用ファイルストリームを表し、読み込みと書き込みの両方の機能を持ちます。
クラスオブジェクトの作成
ここでは、Name(名前)、Employee_ID(社員ID)、Salary(給与)をpublicなデータメンバとして持つEmployeeクラスを例にします。
class Employee {
public:
char Name[];
long Employee_ID;
int Salary;
};
Employee Emp_1;
Emp_1.Name="Jhonson";
Emp_1.Employee_ID=212020;
Emp_1.Salary=11000;
ファイルオブジェクトの作成
構文
fstream/ofstream/ifstream オブジェクト名;
void open(const char *filename, ios::openmode);
ofstream file1;
file1.open("Employee.txt", ios::app);
- ここでは、file1というオブジェクトを使って、追記モード(ios::app)でEmployee.txtを開いています。追記モードでは、新しい内容がファイルの末尾に追加されます。file1の型はofstreamなので、Employee.txtへの書き込みが可能です。
ifstream file2;
file2.open("Employee.txt", ios::in);
- こちらは、file2というオブジェクトを使って、入力モード(ios::in)でEmployee.txtを開き、内容を読み取ります。file2の型はifstreamなので、Employee.txtからデータを読み取ることだけができます。
クラスオブジェクトの書き込みと読み取り
file1.write((char*)&Emp_1, sizeof(Emp_1));
- write関数を呼び出すことで、クラスオブジェクトEmp_1のデータがEmployee.txtに書き込まれます。(char*)&Emp_1はオブジェクトの先頭アドレスを指し、sizeof(Emp_1)はファイルにコピーされるバイト数を計算します。
file2.read((char*)&Emp_1, sizeof(Emp_1));
- read関数を呼び出すことで、Employee.txtからクラスオブジェクトEmp_1へデータが読み込まれます。(char*)&Emp_1はオブジェクトの先頭を指し、sizeof(Emp_1)はファイルから読み取るバイト数を表します。
ファイルを閉じる
file1.close(); file2.close();
close関数を呼び出すことで、ファイルの入力ストリームと出力ストリームを閉じます。
サンプルコード
#include <iostream>
#include <fstream>
using namespace std;
// プロパティを定義するクラス
class Employee {
public:
string Name;
int Employee_ID;
int Salary;
};
int main(){
Employee Emp_1;
Emp_1.Name="John";
Emp_1.Employee_ID=2121;
Emp_1.Salary=11000;
// このデータをEmployee.txtに書き込む
ofstream file1;
file1.open("Employee.txt", ios::app);
file1.write((char*)&Emp_1,sizeof(Emp_1));
file1.close();
// Employee.txtからデータを読み込む
ifstream file2;
file2.open("Employee.txt",ios::in);
file2.seekg(0);
file2.read((char*)&Emp_1,sizeof(Emp_1));
printf("\nName :%s",Emp_1.Name);
printf("\nEmployee ID :%d",Emp_1.Employee_ID);
printf("\nSalary :%d",Emp_1.Salary);
file2.close();
return 0;
}
実行結果
Name: John Employee ID: 2121 Salary: 11000
注意点
上記のコードは仕組みを説明するためのものです。実際にバイナリ形式でシリアライズする場合、std::stringのように内部にポインタを持つメンバを含むクラスをそのままwrite/readすると、正しく保存・復元できず未定義動作を引き起こす可能性があります。この手法を安全に使うのは、固定長のchar配列やintなど、POD型のみで構成されたクラスに限るのが望ましいでしょう。
-
【Swift入門】iOSでファイルを作成・書き込み・読み取りする方法を徹底解説
ソフトウェア開発者にとって、ファイル操作は避けて通れない基本スキルの一つです。ファイルへのデータ書き込みや読み取りなど、標準的な操作は確実にマスターしておきたいところですね。この記事では、実際にファイルを作成し、そこへデータを書き込み、さらにその内容を読み取る方法を、ステップバイステップでわかりやすく解説します。SwiftとXcodeを使った実践的なチュートリアルなので、初めての方でも安心して進められますよ。手順1:Xcodeプロジェクトを作成するまずはXcodeを起動し、「New Project」→「Single View Application」を選択して、プロジェクト名を「Reading
-
C/C++のlseek()でn番目ごとのバイトを読み取り、別のファイルに書き込む方法
このチュートリアルでは、C言語のシステムコール lseek() を使って、ファイルから n バイトおきにデータを読み出し、その内容を別のファイルへ書き込むプログラムについて解説します。処理の概要このプログラムでは、2つのテキストファイル(start.txt と end.txt)を用意します。目的は、1つ目のファイル(入力ファイル)から内容を読み込み、lseek() を使ってファイルポインタを移動させながら、n バイトごとに1バイトずつ抜き出し、2つ目のファイル(出力ファイル)へ書き込むことです。lseek() は、ファイルディスクリプタが指す読み書き位置(オフセット)を変更するためのシステムコ