88* unspecified[italic]
99
1010## 概要
11- 実装によって保証されるファイルを同時に開ける最低限の数を表すマクロ 。
11+ 処理系によって保証されるファイルを同時に開ける最低限の数を表すマクロ 。
1212
1313このマクロは、プログラムが同時にオープンできるファイルの最低限の数を定義する。値は実装依存であり、最低でも8以上であることがC標準によって保証されている。実際の実装では、より大きな値(例:16、256など)が使用されることが多い。
1414
15- この値は実装の最低保証値であり、実際にはより多くのファイルを同時に開ける場合がある。ただし、システムのリソース制限により、この値より少ない数のファイルしか開けない場合もある。
16-
1715また、`FOPEN_MAX`は[`TMP_MAX`](/reference/cstdio/tmp_max.md.nolink)と等しいかそれより大きいことが保証される。
1816
17+ ## 備考
18+ - この値は最低限の保証値であり、実際にはより多くのファイルを開ける場合がある
19+ - システムリソースやOS固有の制限により、この値未満しかファイルを開けない場合もある
20+ - `FOPEN_MAX`で開けるファイルの数は、標準で開かれている3つのストリームも含むため、実際に新たに開けるファイルの数は`FOPEN_MAX - 3`個となる
21+
1922## 例
2023```cpp example
2124#include <cstdio>
2225#include <vector>
26+ #include <filesystem>
27+ #include <format>
2328
2429int main() {
2530 // FOPEN_MAXの値を表示
2631 std::printf("FOPEN_MAX = %d\n", FOPEN_MAX);
2732
28- // 複数のファイルを開いてみる
33+ // 作業用ディレクトリを作成
34+ std::filesystem::path work_dir = "temp_fopen_test";
35+ std::filesystem::create_directory(work_dir);
36+
37+ // 複数のファイルを開いてみる(標準ストリーム3つを除く)
2938 std::vector<std::FILE*> files;
39+ const int max_new_files = FOPEN_MAX - 3; // 標準ストリーム分を除く
3040
31- for (int i = 0; i < FOPEN_MAX; ++i) {
32- char filename[32];
33- std::sprintf(filename, "temp%d.txt", i);
34- std::FILE* file = std::fopen(filename, "w");
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");
3544 if (file) {
3645 files.push_back(file);
3746 std::fprintf(file, "File %d\n", i);
@@ -43,38 +52,32 @@ int main() {
4352
4453 std::printf("Successfully opened %zu files\n", files.size());
4554
46- // ファイルを閉じて削除
55+ // ファイルを閉じる
4756 for (std::FILE* file : files) {
4857 std::fclose(file);
4958 }
5059
51- for (int i = 0; i < static_cast<int>(files.size()); ++i) {
52- char filename[32];
53- std::sprintf(filename, "temp%d.txt", i);
54- std::remove(filename);
55- }
60+ // 作業用ディレクトリごと削除
61+ std::filesystem::remove_all(work_dir);
5662
5763 return 0;
5864}
5965```
6066* FOPEN_MAX[color ff0000]
6167* std::printf[link /reference/cstdio/printf.md]
62- * std::sprintf[link /reference/cstdio/sprintf.md.nolink]
6368* std::fopen[link /reference/cstdio/fopen.md]
6469* std::fprintf[link /reference/cstdio/fprintf.md]
6570* std::fclose[link /reference/cstdio/fclose.md]
66- * std::remove[link /reference/cstdio/remove.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]
6774
6875### 出力例
6976```
7077FOPEN_MAX = 20
71- Successfully opened 20 files
78+ Successfully opened 17 files
7279```
7380
74- ## 備考
75- - この値は最低限の保証値であり、実際にはより多くのファイルを開ける場合がある
76- - システムリソースやOS固有の制限により、この値未満しかファイルを開けない場合もある
77-
7881## 処理系
7982
8083- [Clang](/implementation.md#clang): ??
0 commit comments