C++では、ファイル入出力(I/O)を利用してプログラムが外部ファイルとやり取りすることが可能です。ファイル操作は、データを永続的に保存したり、外部から情報を読み込んだりする際に非常に役立ちます。本記事では、C++の標準ライブラリを使用して、ファイルの読み書き方法を具体的なコード例を交えながら詳しく解説します。
ファイル入出力の基本
C++では、ファイルの入出力を行うために、fstream、ifstream、およびofstreamという3つのクラスが提供されています。これらはすべて、標準ライブラリの<fstream>ヘッダーに含まれています。
ifstream: ファイルからデータを読み取るためのクラス。ofstream: ファイルにデータを書き込むためのクラス。fstream: 読み書き両方に使用できるクラス。
これらのクラスを使用する際には、まずファイルを開き、操作を行った後にファイルを閉じる必要があります。ファイルの読み書きが完了したら、必ずclose()メソッドを呼び出してファイルを閉じることが重要です。
ファイルへの書き込み
まず、ファイルにデータを書き込む基本的な例を見てみましょう。ここではofstreamを使用して、テキストファイルに文字列を書き込みます。
#include <fstream>
#include <iostream>
int main() {
std::ofstream outFile("example.txt");
if (outFile.is_open()) {
outFile << "こんにちは、C++でファイル操作を学びましょう!\n";
outFile << "ファイルへの書き込みが完了しました。\n";
outFile.close();
std::cout << "データを書き込みました。" << std::endl;
} else {
std::cerr << "ファイルを開くことができませんでした。" << std::endl;
}
return 0;
}
このコードは、example.txtという名前のファイルに2行の文字列を記録します。ファイルが正常に開かれた場合、is_open()メソッドがtrueを返し、<<演算子を使ってデータをファイルに書き込みます。書き込みが終わったら、close()メソッドでファイルを閉じます。
ファイルからの読み込み
次に、ifstreamを使ってファイルからデータを読み込む方法を見てみましょう。下記の例では、先ほど作成したexample.txtファイルを読み込みます。
#include <fstream>
#include <iostream>
#include <string>
int main() {
std::ifstream inFile("example.txt");
std::string line;
if (inFile.is_open()) {
while (std::getline(inFile, line)) {
std::cout << line << std::endl;
}
inFile.close();
} else {
std::cerr << "ファイルを開くことができませんでした。" << std::endl;
}
return 0;
}
このコードでは、getline()メソッドを使ってファイルから1行ずつデータを読み込み、その内容をコンソールに表示します。ファイルが正常に開かれた場合、whileループを通じてすべての行が読み込まれ、最後にファイルを閉じます。
バイナリファイルの読み書き
C++では、テキストファイルだけでなく、バイナリファイルの読み書きも可能です。バイナリファイルの操作には、ios::binaryフラグを指定してファイルを開く必要があります。次の例では、バイナリ形式でデータを書き込み、その後読み取ります。
#include <fstream>
#include <iostream>
int main() {
// バイナリファイルへの書き込み
std::ofstream outFile("data.bin", std::ios::binary);
int data = 12345;
if (outFile.is_open()) {
outFile.write(reinterpret_cast<char*>(&data), sizeof(data));
outFile.close();
std::cout << "バイナリファイルにデータを書き込みました。" << std::endl;
}
// バイナリファイルからの読み込み
std::ifstream inFile("data.bin", std::ios::binary);
int readData = 0;
if (inFile.is_open()) {
inFile.read(reinterpret_cast<char*>(&readData), sizeof(readData));
inFile.close();
std::cout << "バイナリファイルから読み込んだデータ: " << readData << std::endl;
}
return 0;
}
この例では、まず整数データをバイナリ形式でdata.binに書き込み、その後同じファイルからデータを読み込んでコンソールに表示します。write()メソッドはバイナリデータの書き込みに、read()メソッドはデータの読み込みに使用されます。
エラーハンドリング
ファイル操作では、エラーが発生する可能性があります。たとえば、ファイルが存在しない、アクセス権がない、ディスクがいっぱいなどの状況が考えられます。C++では、ファイルストリームの状態を確認するために、以下のメソッドを使用してエラーチェックを行うことが推奨されています。
fail(): 入出力操作が失敗したかどうかをチェック。eof(): ファイルの終わりに達したかどうかを確認。bad(): 致命的なエラーが発生したかをチェック。
これらのメソッドを使うことで、より堅牢なファイル操作を実現できます。
エラーチェックの例
#include <fstream>
#include <iostream>
int main() {
std::ifstream inFile("nonexistent.txt");
if (!inFile) {
std::cerr << "ファイルを開くことができませんでした。" << std::endl;
return 1;
}
inFile.close();
return 0;
}
このコードは、存在しないファイルを開こうとした場合にエラーメッセージを表示し、プログラムを終了します。if (!inFile)の条件でファイルが正しく開けなかったことを検出します。
まとめ
この記事では、C++でのファイル入出力について解説しました。ファイルの読み書きは、プログラムの基本的な機能の一部であり、ofstream、ifstream、およびfstreamを活用することで、テキストファイルやバイナリファイルを簡単に操作できます。また、エラーハンドリングを適切に行うことで、堅牢なプログラムを作成することが可能です。
