【C++】ファイル操作をする

C++でファイル操作する方法です。

fstreamライブラリを使用した操作方法

<fstream>ライブラリを使用してファイル操作を行う方法です。

ファイルの読み込み

ファイルを読み込みするには、std::ifstreamを使用します。

ファイルからデータにInputするから、ifstreamと覚えるといいでしょう。

#include <fstream>
#include <string>

int main() {
  std::ifstream file("file_name.txt");
  std::string line;
  while (std::getline(file, line)) {
    // 処理を行う
  }
  file.close();
}

ファイルを開いた後、std::getlineで改行コードまでの1行を読み込みます。

ファイルの終端でstd::getlinefalseを返すのでwhileループを抜けてファイルがクローズされます。

std::ifsreamのもう少し詳細な説明は以下を参照してください。

ファイルの書き込み

ファイルを書き込みするには、std::ofstreamを使用します。

ファイルにOutputするから、ofstreamと覚えるといいでしょう。

#include <fstream>

int main() {
  std::ofstream file("file_name.txt");
  file << "Hello World!!" << std::endl;
  file.close();
}

ファイルを開いて、データを書き込んで、ファイルをクローズしています。

この場合、既に同名のファイルが存在する場合、元のファイルの内容は破棄されて新しいデータで上書きされます。

既存のファイルに追記する場合は、std::ios::appフラグを使います。

#include <fstream>

int main() {
  std::ofstream file("file_name.txt", std::ios::app);
  file << "Append Message!!" << std::endl;
  file.close();
}

std::ofstreamのもう少し詳細な説明は以下を参照してください。

C言語スタイルのファイル操作方法

C++はC言語との互換性があるので、cstdioライブラリを使用してC言語スタイルのファイル操作を行う方法です。

fopen()関数でファイルを開き、読み込み関数 or 書き込み関数でファイル操作を行い、fclose()関数でファイルを閉じます。

ファイルを開く

fopen()関数を使用してファイルを開きます。

#include <cstdio>
#include <iostream>

int main() {
  FILE* fp = fopen("file_name.txt", "r");    // 読み込みモードで開く
  if (fp == nullptr) {
    std::cout << "ファイルを開けませんでした" << std::endl;
    return -1;
  }

  fclose(fp);
}

fopen関数の第二引数はオープンモードとなっています。

ファイル操作モードファイル有りファイル無し
読み込みr開ける開けない
書き込みw開ける(元ファイル内容は破棄)開ける(新規作成される)
追記a開ける(元ファイルの最後に追記)開ける(新規作成される)
読込+書込r+開ける開けない
読込+書込w+開ける(元ファイル内容は破棄)開ける(新規作成される)
読込+追記a+開ける(元ファイルの最後に追記)開ける(新規作成される)
オープンモード

バイナリモードで開く場合は、"rb""ab""w+b"のように"b"を付加します。

ファイルを読み込む

ファイルを読み込むための関数は複数あり、用途によって使い分けます。

#include <cstdio>
#include <iostream>

int main() {
  // file_name.txtを読み込みモードで開く
  FILE* fp = fopen("file_name.txt", "r");
  if (fp == nullptr) {
    std::cout << "ファイルを開けませんでした" << std::endl;
  }

  char buffer[100];
  fgets(buffer, sizeof(buffer), fp);  // 任意のサイズもしくは改行コードまで読み込む
  std::cout << buffer << std::endl;

  int i = fgetc(fp);  // 1文字読み込む
  std::cout << std::to_string(i) << std::endl;

  i = fread(buffer, sizeof(char), sizeof(buffer), fp);  // 任意のサイズ読み込む
  std::cout << buffer << std::endl;

  fclose(fp);
}

fgets()関数はファイルから1行読み込むのに適しています。読み込む最大文字数を指定して関数を呼び出すと最大文字数に達するか改行コードが出現するまで読み込みます。

fgetc()関数はファイルから1文字読み込みます。正直あまり使い道が浮かびません。

fread()関数はバイナリデータを読み込むのに適しています。改行コードやNULL文字などを気にせず指定したサイズ分読み込むことができます。

ファイルを書き込む

ファイルを書き込むための関数は複数あり、用途によって使い分けます。

#include <cstdio>
#include <iostream>

int main() {
  FILE* fp = fopen("file_name2.txt", "w");
  if (fp == nullptr) {
    std::cout << "ファイルを開けませんでした" << std::endl;
  }

  char buffer[] = "てすとてすとてすと\n";
  fputs(buffer, fp);  // 書き込み

  char writebuff[] = "1234567890\n";
  fwrite(writebuff, sizeof(char), sizeof(writebuff)-1, fp);  // 指定サイズ書き込み

  int i = 50;
  fputc(i, fp);  // 1文字書き込み

  fclose(fp);
}
【file_name2.txtの内容】
てすとてすとてすと
1234567890
2

fputs()関数は任意の文字列を書き込みます。

fwrite()関数はバイナリデータを書き込むのに適しています。

fputc()関数は1文字ファイルに書き込みます。あまり使い道が浮かびません。

ファイルを閉じる

fclose()関数でファイルを閉じます。開いたファイルは絶対に閉じましょう。

#include <cstdio>
#include <iostream>

int main() {
  FILE* fp = fopen("file_name.txt", "r");    // 読み込みモードで開く
  if (fp == nullptr) {
    std::cout << "ファイルを開けませんでした" << std::endl;
    return -1;
  }

  fclose(fp);
}

C++でのファイル操作まとめ

上記で紹介した以外にも、WindowsAPIを使用する方法やBoostライブラリを使用する方法もあります。

今回は、標準的な方法でのファイル操作方法の紹介となります。

C++環境で、わざわざC言語スタイルのファイル操作を使う必要は無いと思いますが、覚えておくと多少の応用が効くかもしれません。

スポンサーリンク

  • この記事を書いた人

まさじぃ

ダメプログラマ歴17年です。 プログラミング関連の事や、 自分で使って良かったもの等の紹介をメインにやっています。

-プログラミング
-