Skip to content

Commit fc3bf3d

Browse files
committed
Fixed wrong explanations in fopen_max
1 parent bef6d85 commit fc3bf3d

File tree

1 file changed

+24
-21
lines changed

1 file changed

+24
-21
lines changed

reference/cstdio/fopen_max.md

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,30 +8,39 @@
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
2429
int 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
```
7077
FOPEN_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

Comments
 (0)