Skip to content

Commit b4f048f

Browse files
authored
Create page: fopen_max (#1530)
* Create page: fopen_max * Fixed wrong explanations in fopen_max
1 parent df84025 commit b4f048f

File tree

2 files changed

+86
-1
lines changed

2 files changed

+86
-1
lines changed

reference/cstdio.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
| [`_IONBF`](/reference/cstdio/ionbf.md.nolink) | 入出力をバッファリングしない指定のための整数定数 | |
2424
| [`BUFSIZ`](/reference/cstdio/bufsiz.md) | バッファサイズを表す整数定数 | |
2525
| [`EOF`](/reference/cstdio/eof.md) | ファイルの終端であることを表す`int`型の整数定数 | |
26-
| [`FOPEN_MAX`](/reference/cstdio/fopen_max.md.nolink) | 実装によって保証されるファイルを開ける最低限の数を表す整数定数 | |
26+
| [`FOPEN_MAX`](/reference/cstdio/fopen_max.md) | 実装によって保証されるファイルを開ける最低限の数を表す整数定数 | |
2727
| [`FILENAME_MAX`](/reference/cstdio/filename_max.md) | 実装によって保証されるファイル名の最大の長さを表す整数定数 | |
2828
| [`L_tmpnam`](/reference/cstdio/l_tmpnam.md.nolink) | `tmpnam()`関数によって作られた一時ファイル名を保持する似に必要な長さを表す整数定数 | |
2929
| [`SEEK_SET`](/reference/cstdio/seek_set.md.nolink) | ファイルの先頭位置を指定するための整数定数 | |

reference/cstdio/fopen_max.md

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
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

Comments
 (0)