From 2f35dc053621b8451d7609f46a7c01f34b47681b Mon Sep 17 00:00:00 2001 From: rotarymars Date: Sun, 17 Aug 2025 22:50:58 +0900 Subject: [PATCH 1/7] new page: fwrite.md --- reference/cstdio.md | 2 +- reference/cstdio/fwrite.md | 73 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 reference/cstdio/fwrite.md diff --git a/reference/cstdio.md b/reference/cstdio.md index 297863cfb8..5510092ecd 100644 --- a/reference/cstdio.md +++ b/reference/cstdio.md @@ -55,7 +55,7 @@ | [`fputc`](/reference/cstdio/fputc.md) | ファイルに1文字出力する | | | [`fputs`](/reference/cstdio/fputs.md) | ファイルにN文字出力する | | | [`fread`](/reference/cstdio/fread.md) | ファイルからN文字読み込む | | -| [`fwrite`](/reference/cstdio/fwrite.md.nolink) | ファイルにN文字書き込む | | +| [`fwrite`](/reference/cstdio/fwrite.md) | ファイルにN文字書き込む | | | [`fgetpos`](/reference/cstdio/fgetpos.md.nolink) | ファイルの現在位置を取得する | | | [`fseek`](/reference/cstdio/fseek.md.nolink) | ファイルの現在位置を移動する | | | [`fsetpos`](/reference/cstdio/fsetpos.md.nolink) | ファイルの現在位置を設定する | | diff --git a/reference/cstdio/fwrite.md b/reference/cstdio/fwrite.md new file mode 100644 index 0000000000..fefe620bd9 --- /dev/null +++ b/reference/cstdio/fwrite.md @@ -0,0 +1,73 @@ +# fwrite +* cstdio[meta header] +* std[meta namespace] +* function[meta id-type] + +```cpp +namespace std { + size_t fwrite(const void *buffer, size_t size, size_t count, FILE *stream); +} +``` + +## 概要 +ファイルに`count`個の`size`バイトのデータを書き込む。 + +ファイル内の位置は、書き込まれたバイトだけ進む。 + +## 要件 +- `buffer`は有効なポインタであること。 +- `stream`は有効なファイルストリームであること。 + +## 戻り値 +正常に書き込むことのできた項目の数を返す。 + +`size`または`count`のいずれかが0だった場合、必ず`0`を返し、`buffer`は変更されない。 + +## 効果 +`buffer`が指すメモリから`count`個の`size`バイトのデータを`stream`に書き込む。 + +書き込みエラーが生じなければ、書き込むデータの大きさは`count * size`バイトである。 + +## 例 +```cpp example +#include + +int main() { + std::FILE *file = std::fopen("output.txt", "w"); + if (!file) { + std::perror("ファイルを開けませんでした"); + return 1; + } + + const char data[] = "Hello, World!"; + /* + 厳密には、sizeof(char)は1バイトであることが保証されているため、 + sizeof(data) - 1は、文字列の長さ(ヌル終端文字を除く)と等しくなる。 + */ + std::size_t count = std::fwrite(data, sizeof(char), sizeof(data) - 1, file); + std::printf("書き込んだデータの長さ: %zu\n", count); + + std::fclose(file); + return 0; +} +``` +* std::fwrite[color ff0000] +* std::fopen[link /reference/cstdio/fopen.md] +* std::fclose[link /reference/cstdio/fclose.md] +* std::perror[link /reference/cstdio/perror.md.nolink] +* std::printf[link /reference/cstdio/printf.md] + +### 出力例 +``` +書き込んだデータの長さ: 13 +``` + +### ファイル出力(output.txt) +``` +Hello, World! +``` + +## 処理系 +- [Clang](/implementation.md#clang): ?? +- [GCC](/implementation.md#gcc): ?? +- [Visual C++](/implementation.md#visual_cpp): ?? From 4ac817784650144e839da20adc5a10b984fdc4d5 Mon Sep 17 00:00:00 2001 From: rotarymars Date: Thu, 21 Aug 2025 23:04:00 +0900 Subject: [PATCH 2/7] Update reference/cstdio/fwrite.md Co-authored-by: Koichi Murase --- reference/cstdio/fwrite.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reference/cstdio/fwrite.md b/reference/cstdio/fwrite.md index fefe620bd9..460a8c2822 100644 --- a/reference/cstdio/fwrite.md +++ b/reference/cstdio/fwrite.md @@ -10,9 +10,9 @@ namespace std { ``` ## 概要 -ファイルに`count`個の`size`バイトのデータを書き込む。 +ストリームに`count`個の`size`バイトのデータを書き込む。 -ファイル内の位置は、書き込まれたバイトだけ進む。 +ストリーム内の位置は、書き込まれたバイトだけ進む。 ## 要件 - `buffer`は有効なポインタであること。 From 8be421316ab3130e11f39a2acb9b50b42ecbcd68 Mon Sep 17 00:00:00 2001 From: rotarymars Date: Thu, 21 Aug 2025 23:12:10 +0900 Subject: [PATCH 3/7] added precise description in fwrite --- reference/cstdio/fwrite.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/reference/cstdio/fwrite.md b/reference/cstdio/fwrite.md index 460a8c2822..c5b1449e7d 100644 --- a/reference/cstdio/fwrite.md +++ b/reference/cstdio/fwrite.md @@ -14,6 +14,10 @@ namespace std { ストリーム内の位置は、書き込まれたバイトだけ進む。 +書き込み時にエラーが発生した場合、ストリーム内の位置は不定である。 + +また、書き込みには内部的に[`fputc`](/reference/cstdio/fputc.md)を使用する。 + ## 要件 - `buffer`は有効なポインタであること。 - `stream`は有効なファイルストリームであること。 From 28435a21ae4ade531d0a1b6cbe01796a61870391 Mon Sep 17 00:00:00 2001 From: rotarymars Date: Thu, 21 Aug 2025 23:24:02 +0900 Subject: [PATCH 4/7] deleted extra information --- reference/cstdio/fwrite.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/reference/cstdio/fwrite.md b/reference/cstdio/fwrite.md index c5b1449e7d..5267294aa6 100644 --- a/reference/cstdio/fwrite.md +++ b/reference/cstdio/fwrite.md @@ -25,8 +25,6 @@ namespace std { ## 戻り値 正常に書き込むことのできた項目の数を返す。 -`size`または`count`のいずれかが0だった場合、必ず`0`を返し、`buffer`は変更されない。 - ## 効果 `buffer`が指すメモリから`count`個の`size`バイトのデータを`stream`に書き込む。 From 222f890ab68f8f6d78ad0332a3abef3751ce1d63 Mon Sep 17 00:00:00 2001 From: rotarymars Date: Thu, 21 Aug 2025 23:39:47 +0900 Subject: [PATCH 5/7] unified expressions in fwrite --- reference/cstdio/fwrite.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reference/cstdio/fwrite.md b/reference/cstdio/fwrite.md index 5267294aa6..444b0f005e 100644 --- a/reference/cstdio/fwrite.md +++ b/reference/cstdio/fwrite.md @@ -10,7 +10,7 @@ namespace std { ``` ## 概要 -ストリームに`count`個の`size`バイトのデータを書き込む。 +ストリームに`count`個の`size`バイトの要素を書き込む。 ストリーム内の位置は、書き込まれたバイトだけ進む。 @@ -23,10 +23,10 @@ namespace std { - `stream`は有効なファイルストリームであること。 ## 戻り値 -正常に書き込むことのできた項目の数を返す。 +正常に書き込むことのできた要素の数を返す。 ## 効果 -`buffer`が指すメモリから`count`個の`size`バイトのデータを`stream`に書き込む。 +`buffer`が指すメモリから`count`個の`size`バイトの要素を`stream`に書き込む。 書き込みエラーが生じなければ、書き込むデータの大きさは`count * size`バイトである。 From f596c4c80a11d09c624780bc20fec2a91fb5463d Mon Sep 17 00:00:00 2001 From: rotarymars Date: Thu, 21 Aug 2025 23:51:20 +0900 Subject: [PATCH 6/7] added appropriate explanations for function with `restrict` --- reference/cstdio/fgets.md | 5 +++++ reference/cstdio/fputs.md | 5 +++++ reference/cstdio/fread.md | 1 + reference/cstdio/fwrite.md | 1 + 4 files changed, 12 insertions(+) diff --git a/reference/cstdio/fgets.md b/reference/cstdio/fgets.md index 459603dd13..354af131a3 100644 --- a/reference/cstdio/fgets.md +++ b/reference/cstdio/fgets.md @@ -16,6 +16,11 @@ namespace std { また、改行にたどり着くとそこで読み込みを終了する(末尾に改行文字を含める)。 +## 要件 +- `str`は有効なポインタであること。 +- `stream`は有効なファイルストリームであること。 +- `str`が指すメモリ領域と`stream`が指すファイルストリームの内部バッファが重複していないこと。 + ## 戻り値 成功すれば読み込まれた文字列を、そうでなければ`NULL`を返す。 diff --git a/reference/cstdio/fputs.md b/reference/cstdio/fputs.md index c00edfd847..7d79856ae2 100644 --- a/reference/cstdio/fputs.md +++ b/reference/cstdio/fputs.md @@ -12,6 +12,11 @@ namespace std { ## 概要 ファイルに渡された文字列を出力する。 +## 要件 +- `str`は有効なポインタであること。 +- `stream`は有効なファイルストリームであること。 +- `str`が指すメモリ領域と`stream`が指すファイルストリームの内部バッファが重複していないこと。 + ## 戻り値 正常終了した場合は`0`を、そうでなければ[`EOF`](/reference/cstdio/eof.md)を返す。 diff --git a/reference/cstdio/fread.md b/reference/cstdio/fread.md index a2918cf229..116b601c9b 100644 --- a/reference/cstdio/fread.md +++ b/reference/cstdio/fread.md @@ -17,6 +17,7 @@ namespace std { ## 要件 - `buffer`は有効なポインタであること。 - `stream`は有効なファイルストリームであること。 +- `buffer`が指すメモリ領域と`stream`が指すファイルストリームの内部バッファが重複していないこと。 ## 戻り値 正常に読み込むことのできた項目の数を返す。 diff --git a/reference/cstdio/fwrite.md b/reference/cstdio/fwrite.md index 444b0f005e..b07ad0c4ba 100644 --- a/reference/cstdio/fwrite.md +++ b/reference/cstdio/fwrite.md @@ -21,6 +21,7 @@ namespace std { ## 要件 - `buffer`は有効なポインタであること。 - `stream`は有効なファイルストリームであること。 +- `buffer`が指すメモリ領域と`stream`が指すファイルストリームの内部バッファが重複していないこと。 ## 戻り値 正常に書き込むことのできた要素の数を返す。 From 471007848c5bc30943898cdb6ee5136b5fc2cda0 Mon Sep 17 00:00:00 2001 From: rotarymars Date: Fri, 5 Sep 2025 21:29:52 +0900 Subject: [PATCH 7/7] Added \n for fwrite.md --- reference/cstdio/fwrite.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/cstdio/fwrite.md b/reference/cstdio/fwrite.md index b07ad0c4ba..c21f708aab 100644 --- a/reference/cstdio/fwrite.md +++ b/reference/cstdio/fwrite.md @@ -42,7 +42,7 @@ int main() { return 1; } - const char data[] = "Hello, World!"; + const char data[] = "Hello, World!\n"; /* 厳密には、sizeof(char)は1バイトであることが保証されているため、 sizeof(data) - 1は、文字列の長さ(ヌル終端文字を除く)と等しくなる。