C++ でファイルに書き込む
![C++ でファイルに書き込む](/img/Cpp/feature-image---cpp-write-to--file.webp)
この記事では、C++ でファイルに書き込む方法をいくつか説明します。
ファイルに書き込むには fstream
と <<
演算子を使用する
C++ のファイル I/O
は、ストリームの操作と配置のための複数の組み込みメソッドを提供する fstream
クラスを使用して処理されます。fstream
オブジェクトが宣言されたら、open
関数を呼び出して、ファイルの名前とファイルを開くモードを引数として渡すことができます。
ファイルに書き込む場合は、std::ios_base::out
モードを指定します。次に、ファイルがストリームオブジェクトと正常に関連付けられたかどうか、つまり if
の状態で is_open
メソッドを呼び出したかどうかを確認します。この時点で、ファイルは <<
演算子を使って入力を受け取り、必要に応じて出力を処理する準備ができています。
また、else
ブロックはエラーロギングの目的で利用することもできますし、フォールトトレラントなプログラム実行のためにエラー処理ルーチンを実装することもできます。
#include <fstream>
#include <iostream>
using std::cout;
using std::endl;
using std::fstream;
using std::ofstream;
using std::string;
int main() {
string filename("tmp.txt");
fstream file_out;
file_out.open(filename, std::ios_base::out);
if (!file_out.is_open()) {
cout << "failed to open " << filename << '\n';
} else {
file_out << "Some random text to write." << endl;
cout << "Done Writing!" << endl;
}
return EXIT_SUCCESS;
}
出力:
Done Writing!
fstream
および write
関数を使用してファイルに書き込む
ファイルに書き込むもう一つの方法は、組み込みの fstream
オブジェクトから呼び出すことができる write
関数です。関数 write
は文字列ポインタとそのアドレスに格納されているデータのサイズを受け取ります。その結果、呼び出したストリームオブジェクトに関連付けられたファイルにデータが挿入されます。
以下のコードサンプルでは、open
関数呼び出しのステータスを表示することで、最小限のエラー報告が可能であることを示していますが、実際のアプリケーションでは、より堅牢な例外処理が必要となります。
#include <fstream>
#include <iostream>
using std::cout;
using std::endl;
using std::fstream;
using std::ofstream;
using std::string;
int main() {
string text("Some huge text to write to\n");
string filename2("tmp2.txt");
fstream outfile;
outfile.open(filename2, std::ios_base::out);
if (!outfile.is_open()) {
cout << "failed to open " << filename2 << '\n';
} else {
outfile.write(text.data(), text.size());
cout << "Done Writing!" << endl;
}
return EXIT_SUCCESS;
}
出力:
Done Writing!
fwrite
関数を使ってファイルに書き込む
あるいは、C 言語のファイル I/O
から fwrite
関数を使ってファイルに書き込むこともできます。fwrite
は void
ポインタからデータを取得し、プログラマはそのアドレスに格納されているアイテムの数と各アイテムのサイズを渡す責任があります。この関数はファイルストリームが FILE*
型である必要があり、これは fopen
関数を呼び出すことで取得できます。
fwrite
は操作が成功した場合にファイルに書き込まれたアイテムの数を返すことに注意してください。
#include <fstream>
#include <iostream>
using std::cout;
using std::endl;
using std::ofstream;
using std::string;
int main() {
string text("Some huge text to write to\n");
string filename3("tmp3.txt");
FILE *o_file = fopen(filename3.c_str(), "w+");
if (o_file) {
fwrite(text.c_str(), 1, text.size(), o_file);
cout << "Done Writing!" << endl;
}
return EXIT_SUCCESS;
}
出力:
Done Writing!