ファイル入出力(File I/O)は、プログラムでファイルのデータを読み書きするための重要な技術です。C++では、標準ライブラリを利用することで簡単にファイル操作を行うことができます。この記事では、C++におけるファイル入出力の基本的な方法から、高度な操作までを網羅的に説明します。
1. ファイル操作の基本
C++では、ファイルの読み書きに関して、fstreamというヘッダファイルを利用します。このヘッダファイルには、ファイルを開くためのストリームクラスであるifstream(入力用)、ofstream(出力用)、そしてその両方を提供するfstreamが含まれています。
1.1 ファイルのオープン
ファイルを操作する前に、まずファイルを開く必要があります。ファイルは、読み込み専用、書き込み専用、またはその両方で開くことができます。以下は、ファイルを開くための基本的な方法です。
cpp#include
#include
using namespace std;
int main() {
// 出力用ファイルストリーム
ofstream outFile("example.txt");
// ファイルが正常に開けたか確認
if (!outFile) {
cout << "ファイルを開けませんでした" << endl;
return 1;
}
outFile << "こんにちは、C++のファイル操作!" << endl;
outFile.close(); // ファイルを閉じる
// 入力用ファイルストリーム
ifstream inFile("example.txt");
if (!inFile) {
cout << "ファイルが見つかりません" << endl;
return 1;
}
string line;
while (getline(inFile, line)) {
cout << line << endl;
}
inFile.close(); // ファイルを閉じる
return 0;
}
上記のコードでは、ofstreamを使用して「example.txt」というファイルにデータを書き込んでいます。次に、ifstreamを使用して同じファイルからデータを読み込み、その内容を画面に表示します。
1.2 ファイルの種類
ファイルを開く際には、さまざまなモードを指定できます。以下は主なモードです。
-
ios::in: 入力用(読み込み専用) -
ios::out: 出力用(書き込み専用) -
ios::app: 追記モード(ファイルの末尾にデータを書き込む) -
ios::binary: バイナリモード(バイナリデータを扱う) -
ios::trunc: ファイルが存在する場合、その内容を削除して新しく作成(デフォルトでofstreamはこのモード)
1.3 ファイルのクローズ
ファイル操作が終了したら、必ずファイルを閉じる必要があります。これにより、バッファリングされたデータが確実にファイルに書き込まれ、リソースが解放されます。close()関数を使用してファイルを閉じます。
2. エラーチェックとファイルの存在確認
ファイル操作を行う際には、ファイルが正しく開けたかどうかを確認することが重要です。C++では、ファイルが正常に開けたかどうかをif文で確認することができます。
cppifstream inFile("example.txt");
if (!inFile) {
cerr << "エラー: ファイルを開けませんでした。" << endl;
return 1;
}
また、ファイルが存在しない場合や、書き込み権限がない場合などには、エラーメッセージを表示して処理を中止するのが良いでしょう。
3. ファイルへの書き込み
ファイルへの書き込みには、ofstreamを使用します。基本的な書き込み操作は、単純にファイルストリームにデータを挿入することで行います。
cppofstream outFile("data.txt");
if (outFile.is_open()) {
outFile << "データ1\n";
outFile << "データ2\n";
outFile << "データ3\n";
outFile.close();
} else {
cout << "ファイルを開けませんでした" << endl;
}
この例では、data.txtというファイルに複数行のデータを順番に書き込んでいます。
4. ファイルからの読み込み
ファイルからデータを読み込む場合、ifstreamを使用します。getline()関数を使うと、ファイルの1行を読み取ることができます。
cppifstream inFile("data.txt");
string line;
while (getline(inFile, line)) {
cout << line << endl;
}
inFile.close();
このコードでは、data.txtファイルから1行ずつ読み込み、コンソールに出力します。
5. バイナリファイルの読み書き
テキストファイルではなく、バイナリファイルを読み書きする場合、ios::binaryモードを指定します。バイナリファイルでは、通常のテキストとしての書き込みや読み込みではなく、バイト単位でデータを扱います。
cppofstream outFile("binarydata.dat", ios::binary);
int number = 12345;
outFile.write(reinterpret_cast<char*>(&number), sizeof(number));
outFile.close();
ifstream inFile("binarydata.dat", ios::binary);
int readNumber;
inFile.read(reinterpret_cast<char*>(&readNumber), sizeof(readNumber));
cout << "読み取った番号: " << readNumber << endl;
inFile.close();
上記のコードでは、整数型のデータをバイナリ形式でファイルに書き込み、再度読み込んでいます。
6. ファイル操作の応用例
C++では、ファイルの読み書きだけでなく、ファイルを一時的に変更したり、既存のデータを更新したりすることもできます。以下は、ファイル内の特定の行を変更する例です。
cpp#include
#include
#include
#include
using namespace std;
int main() {
ifstream inFile("example.txt");
vector lines;
string line;
while (getline(inFile, line)) {
lines.push_back(line);
}
inFile.close();
// 特定の行を変更
lines[1] = "変更された行です";
ofstream outFile("example.txt");
for (const auto& newLine : lines) {
outFile << newLine << endl;
}
outFile.close();
return 0;
}
この例では、ファイルを1行ずつ読み込んでベクターに保存し、特定の行を変更した後、再度ファイルに書き戻しています。
7. ファイルの削除
ファイルを削除するには、remove()関数を使用します。この関数は、指定したファイルを削除します。
cpp#include
int main() {
if (remove("example.txt") != 0) {
perror("ファイル削除に失敗しました");
} else {
cout << "ファイルが削除されました" << endl;
}
return 0;
}
このコードは、「example.txt」というファイルを削除し、成功した場合はメッセージを表示します。
結論
C++におけるファイル入出力は非常に強力であり、さまざまな操作を柔軟に行うことができます。ファイルを読み書きする際は、適切なエラーチェックとリソース管理を行い、プログラムが予期せぬ動作をしないようにすることが重要です。上記で説明した基本的な操作を理解した上で、より複雑なファイル処理を実装できるようになります。
