format_list_bulleted
【C++】C++でファイルの作成、書き込みをする方法(std::fstream)について解説
最終更新日時:2020-12-28 03:49:41



C++でファイルの読み書きをするためのライブラリのfstreamを用いてファイルの書き込みをする方法について紹介します。また、ファイルの末尾に文字を追加する方法についても紹介します。ファイルの読み込みについては「C++でファイルの読み込みを行う方法(std::fstream)について紹介」を参考にしてみてください。

ファイルを新規に作成する例

ファイルの書き込みを扱うことができるofstream型の変数を用いてstring型の文字列をsample.txtというテキストファイルとして出力する例です。

サンプルコード

タイトル:main.cpp

#include <fstream>
#include <string>

int main(int argc, char *argv[]){
    std::ofstream writing_file;
    std::string filename = "sample.txt";
    writing_file.open(filename, std::ios::out);
    std::string writing_text = "C++(シープラスプラス)は、汎用プログラミング言語のひとつである。\n日本語話者の間では「シープラ」又は「シープラプラ」と通称される。";
    writing_file << writing_text << std::endl;
    writing_file.close();
    return 0;
}

コードの解説

コードの解説をしていきます。今回使用するライブラリは2つですがそのうち、stringはstring型の文字列を扱うために必要なライブラリであるため、ファイルの書き込みに必要なライブラリはfstreamとなります。

タイトル:main.cpp

std::ofstream writing_file;
std::string filename = "sample.txt";
writing_file.open(filename, std::ios::out);

まず、ファイルの書き込みに必要となるofstream型の変数writing_fileを宣言し、openメンバ関数を用いてsample.txtという名前のファイルを展開します。もし、sample.txtという名前のファイル名が存在しない場合は、新たにファイルが作成されます。open関数では第二引数としてファイルを開くモードを指定しています。これはstd::ios_baseクラスで定義されたモードでoutとは書き込み専用を表しています。第二引数は省略可能でofstream方はデフォルトでoutが指定されます(今回は故意に第二引数で明示的に指定しています)。

タイトル:main.cpp

std::string writing_text = "C++(シープラスプラス)は、汎用プログラミング言語のひとつである。\n日本語話者の間では「シープラ」又は「シープラプラ」と通称される。";
writing_file << writing_text << std::endl;

続いてofstream型の変数にstring型の文字列を加えていきます。ストリームであるので<<という演算子を用いて文字列を加えます。

タイトル:main.cpp

writing_file.close();

最後に展開しているofstreamを閉じることでメモリを開放します。この処理は記述しなくても、実行がofstream型のスコープから離れた際に自動的に行われるので意図的に記述する必要はありませんが、紹介のために用いています。

ファイルに追加で書き込みを行う例

前項で紹介したのはファイルの内容を全て書き換えるものでしたが、本項ではすでに書き込みがあるファイルに追加で書き込みを行う方法について紹介します。

サンプルコード

タイトル:main.cpp

#include <fstream>
#include <string>

int main(int argc, char *argv[]){
    std::ofstream writing_file;
    std::string filename = "sample.txt";
    writing_file.open(filename, std::ios::app);
    std::string writing_text = "アセンブリ言語以外の低水準言語を必要としないこと、使わない機能に時間的・空間的コストを必要としないことが、言語設計の重要な原則となっている。";
    writing_file << writing_text << std::endl;
    writing_file.close();
    return 0;
}

コードの解説

先ほどのコードとの違いは一点だけです。変更点以外のの処理については前項の解説を参照してください。

タイトル:main.cpp

writing_file.open(filename, std::ios::app);

ファイルの開き方をstd::ios::appに指定しただけです。appとはappendの略で、書き込みの直前で、書き込み位置をストリームの最後に移動させるという意味を表しています。したがって、読み込んだファイルの末尾に文字列を追加することが可能になります。

ofstreamを用いずにファイルを作成する

先ほどまで、ofstreamを用いた出力を紹介しましたが、ファイルの実行時に標準出力のファイル出力をすることでファイルの作成をすることもできます。実行ログを出力する際などにはこちらのやり方が便利です。

タイトル:ターミナル

$ ./main.out > sample.txt

実行時に上記のような指定をすることで、main.outの実行時の標準出力をsample.txtに出力させることができます。ofstreamを導入する必要がないので手軽ですが、当然、一度の実行での複数ファイルの生成などはできないので必要に応じた使い方が必要になります。

まとめ

本記事ではC++でファイルの書き込みをする方法について紹介しました。最後に内容を簡単にまとめておきます。

  • fstreamライブラリのofstream型を用いることでファイルの書き込みを行うことができる
  • openメンバ関数の第二引数をappに指定することでファイルの末尾追加を行うことができる
  • ファイル実行時に出力ファイルを指定することで標準出力のファイル出力を行うこともできる