|
| 1 | +# FOPEN_MAX |
| 2 | +* cstdio[meta header] |
| 3 | +* macro[meta id-type] |
| 4 | + |
| 5 | +```cpp |
| 6 | +#define FOPEN_MAX unspecified |
| 7 | +``` |
| 8 | +* unspecified[italic] |
| 9 | +
|
| 10 | +## 概要 |
| 11 | +処理系によって保証されるファイルを同時に開ける最低限の数を表すマクロ。 |
| 12 | +
|
| 13 | +このマクロは、プログラムが同時にオープンできるファイルの最低限の数を定義する。値は実装依存であり、最低でも8以上であることがC標準によって保証されている。実際の実装では、より大きな値(例:16、256など)が使用されることが多い。 |
| 14 | +
|
| 15 | +また、`FOPEN_MAX`は[`TMP_MAX`](/reference/cstdio/tmp_max.md.nolink)と等しいかそれより大きいことが保証される。 |
| 16 | +
|
| 17 | +## 備考 |
| 18 | +- この値は最低限の保証値であり、実際にはより多くのファイルを開ける場合がある |
| 19 | +- システムリソースやOS固有の制限により、この値未満しかファイルを開けない場合もある |
| 20 | +- `FOPEN_MAX`で開けるファイルの数は、標準で開かれている3つのストリームも含むため、実際に新たに開けるファイルの数は`FOPEN_MAX - 3`個となる |
| 21 | +
|
| 22 | +## 例 |
| 23 | +```cpp example |
| 24 | +#include <cstdio> |
| 25 | +#include <vector> |
| 26 | +#include <filesystem> |
| 27 | +#include <format> |
| 28 | +
|
| 29 | +int main() { |
| 30 | + // FOPEN_MAXの値を表示 |
| 31 | + std::printf("FOPEN_MAX = %d\n", FOPEN_MAX); |
| 32 | +
|
| 33 | + // 作業用ディレクトリを作成 |
| 34 | + std::filesystem::path work_dir = "temp_fopen_test"; |
| 35 | + std::filesystem::create_directory(work_dir); |
| 36 | +
|
| 37 | + // 複数のファイルを開いてみる(標準ストリーム3つを除く) |
| 38 | + std::vector<std::FILE*> files; |
| 39 | + const int max_new_files = FOPEN_MAX - 3; // 標準ストリーム分を除く |
| 40 | +
|
| 41 | + for (int i = 0; i < max_new_files; ++i) { |
| 42 | + auto filepath = work_dir / std::format("temp{}.txt", i); |
| 43 | + std::FILE* file = std::fopen(filepath.string().c_str(), "w"); |
| 44 | + if (file) { |
| 45 | + files.push_back(file); |
| 46 | + std::fprintf(file, "File %d\n", i); |
| 47 | + } else { |
| 48 | + std::printf("Failed to open file %d\n", i); |
| 49 | + break; |
| 50 | + } |
| 51 | + } |
| 52 | +
|
| 53 | + std::printf("Successfully opened %zu files\n", files.size()); |
| 54 | +
|
| 55 | + // ファイルを閉じる |
| 56 | + for (std::FILE* file : files) { |
| 57 | + std::fclose(file); |
| 58 | + } |
| 59 | +
|
| 60 | + // 作業用ディレクトリごと削除 |
| 61 | + std::filesystem::remove_all(work_dir); |
| 62 | +
|
| 63 | + return 0; |
| 64 | +} |
| 65 | +``` |
| 66 | +* FOPEN_MAX[color ff0000] |
| 67 | +* std::printf[link /reference/cstdio/printf.md] |
| 68 | +* std::fopen[link /reference/cstdio/fopen.md] |
| 69 | +* std::fprintf[link /reference/cstdio/fprintf.md] |
| 70 | +* std::fclose[link /reference/cstdio/fclose.md] |
| 71 | +* std::format[link /reference/format/format.md] |
| 72 | +* std::filesystem::create_directory[link /reference/filesystem/create_directory.md] |
| 73 | +* std::filesystem::remove_all[link /reference/filesystem/remove_all.md] |
| 74 | + |
| 75 | +### 出力例 |
| 76 | +``` |
| 77 | +FOPEN_MAX = 20 |
| 78 | +Successfully opened 17 files |
| 79 | +``` |
| 80 | +
|
| 81 | +## 処理系 |
| 82 | +
|
| 83 | +- [Clang](/implementation.md#clang): ?? |
| 84 | +- [GCC](/implementation.md#gcc): ?? |
| 85 | +- [Visual C++](/implementation.md#visual_cpp): ?? |
0 commit comments