最終更新日時(UTC):
が更新

履歴 編集

macro
<cstdio>

FOPEN_MAX

#define FOPEN_MAX unspecified

概要

処理系によって保証されるファイルを同時に開ける最低限の数を表すマクロ。

このマクロは、プログラムが同時にオープンできるファイルの最低限の数を定義する。値は実装依存であり、最低でも8以上であることがC標準によって保証されている。実際の実装では、より大きな値(例:16、256など)が使用されることが多い。

また、FOPEN_MAXTMP_MAXと等しいかそれより大きいことが保証される。

備考

  • この値は最低限の保証値であり、実際にはより多くのファイルを開ける場合がある
  • システムリソースやOS固有の制限により、この値未満しかファイルを開けない場合もある
  • FOPEN_MAXで開けるファイルの数は、標準で開かれている3つのストリームも含むため、実際に新たに開けるファイルの数はFOPEN_MAX - 3個となる

#include <cstdio>
#include <vector>
#include <filesystem>
#include <format>

int main() {
  // FOPEN_MAXの値を表示
  std::printf("FOPEN_MAX = %d\n", FOPEN_MAX);

  // 作業用ディレクトリを作成
  std::filesystem::path work_dir = "temp_fopen_test";
  std::filesystem::create_directory(work_dir);

  // 複数のファイルを開いてみる(標準ストリーム3つを除く)
  std::vector<std::FILE*> files;
  const int max_new_files = FOPEN_MAX - 3; // 標準ストリーム分を除く

  for (int i = 0; i < max_new_files; ++i) {
    auto filepath = work_dir / std::format("temp{}.txt", i);
    std::FILE* file = std::fopen(filepath.string().c_str(), "w");
    if (file) {
      files.push_back(file);
      std::fprintf(file, "File %d\n", i);
    } else {
      std::printf("Failed to open file %d\n", i);
      break;
    }
  }

  std::printf("Successfully opened %zu files\n", files.size());

  // ファイルを閉じる
  for (std::FILE* file : files) {
    std::fclose(file);
  }

  // 作業用ディレクトリごと削除
  std::filesystem::remove_all(work_dir);

  return 0;
}

出力例

FOPEN_MAX = 20
Successfully opened 17 files

処理系