diff --git a/reference/cstdio.md b/reference/cstdio.md index def9b35f10..ec93b5362c 100644 --- a/reference/cstdio.md +++ b/reference/cstdio.md @@ -56,9 +56,9 @@ | [`fputs`](/reference/cstdio/fputs.md) | ファイルにN文字出力する | | | [`fread`](/reference/cstdio/fread.md) | ファイルからN文字読み込む | | | [`fwrite`](/reference/cstdio/fwrite.md) | ファイルにN文字書き込む | | -| [`fgetpos`](/reference/cstdio/fgetpos.md.nolink) | ファイルの現在位置を取得する | | +| [`fgetpos`](/reference/cstdio/fgetpos.md) | ファイルの現在位置を取得する | | | [`fseek`](/reference/cstdio/fseek.md.nolink) | ファイルの現在位置を移動する | | -| [`fsetpos`](/reference/cstdio/fsetpos.md.nolink) | ファイルの現在位置を設定する | | +| [`fsetpos`](/reference/cstdio/fsetpos.md) | ファイルの現在位置を設定する | | | [`ftell`](/reference/cstdio/ftell.md.nolink) | ファイルの現在位置を取得する | | | [`rewind`](/reference/cstdio/rewind.md.nolink) | ファイルの現在位置を先頭に戻し、エラーや終端判定をクリアする | | | [`clearerr`](/reference/cstdio/clearerr.md.nolink) | エラーをクリアする | | diff --git a/reference/cstdio/fgetpos.md b/reference/cstdio/fgetpos.md new file mode 100644 index 0000000000..9440ba3352 --- /dev/null +++ b/reference/cstdio/fgetpos.md @@ -0,0 +1,72 @@ +# fgetpos +* cstdio[meta header] +* std[meta namespace] +* function[meta id-type] + +```cpp +namespace std { + int fgetpos(FILE* stream, fpos_t* pos); +} +``` + +## 概要 +ファイルの現在位置を取得する。 + +## 戻り値 +正常に実行されれば0を返す。 + +失敗した場合は、0以外を返し、エラーの内容は[`errno`](/reference/cerrno/errno.md)から参照することができる。 + +## この機能が必要になった背景・経緯 +かつては[`ftell`](/reference/cstdio/ftell.md.nolink)で位置を取得していたが、`ftell`は位置を`long int`で返すため、非常に大きなファイルやマルチバイト文字を含む特殊なファイルでは正確に表現できないことがあった。 + +そこで、どのようなファイルでも位置を正確に表現できる`fpos_t`型が導入されたことに伴い、この関数が登場した。 + +## 例 +```cpp example +#include +#include + +int main() { + std::FILE *file = std::fopen("example.txt", "w"); + if (file == nullptr) { + std::perror("Failed to open file"); + return 1; + } + std::fpos_t current_pos; + std::fgetpos(file, ¤t_pos); + std::fputs("Hello, World!\n", file); + std::fsetpos(file, ¤t_pos); + std::fputs("h", file); + std::fclose(file); + file = std::fopen("example.txt", "r"); + if (file == nullptr) { + std::perror("Failed to open file"); + return 1; + } + int ch; + while ((ch = std::fgetc(file)) != EOF) { + std::putchar(ch); + } + std::fclose(file); + return 0; +} +``` +* std::fgetpos[color ff0000] +* std::fsetpos[link /reference/cstdio/fsetpos.md] +* std::fopen[link /reference/cstdio/fopen.md] +* std::fputs[link /reference/cstdio/fputs.md] +* std::fclose[link /reference/cstdio/fclose.md] +* std::perror[link /reference/cstdio/perror.md.nolink] +* std::fgetc[link /reference/cstdio/fgetc.md] +* std::putchar[link /reference/cstdio/putchar.md] + +## 出力 +``` +hello, World! +``` + +## 処理系 +- [Clang](/implementation.md#clang): ?? +- [GCC](/implementation.md#gcc): ?? +- [Visual C++](/implementation.md#visual_cpp): ?? diff --git a/reference/cstdio/fpos_t.md b/reference/cstdio/fpos_t.md index 9c1a6e3561..503b95b9e0 100644 --- a/reference/cstdio/fpos_t.md +++ b/reference/cstdio/fpos_t.md @@ -13,7 +13,7 @@ namespace std { ## 概要 ファイルの位置を保持するための型。 -[`fgetpos()`](/reference/cstdio/fgetpos.md.nolink)関数や[`fsetpos()`](/reference/cstdio/fsetpos.md.nolink)関数で用いられる。これらの関数は[`fseek()`](/reference/cstdio/fseek.md.nolink)関数や[`ftell()`](/reference/cstdio/ftell.md.nolink)関数と違い、巨大なファイルやマルチバイトファイルに対しても適切に動作することを目的に設計された。 +[`fgetpos()`](/reference/cstdio/fgetpos.md)関数や[`fsetpos()`](/reference/cstdio/fsetpos.md)関数で用いられる。これらの関数は[`fseek()`](/reference/cstdio/fseek.md.nolink)関数や[`ftell()`](/reference/cstdio/ftell.md.nolink)関数と違い、巨大なファイルやマルチバイトファイルに対しても適切に動作することを目的に設計された。 ## 例 ```cpp example @@ -43,8 +43,8 @@ int main() { ``` * std::fpos_t[color ff0000] -* std::fgetpos[link /reference/cstdio/fgetpos.md.nolink] -* std::fsetpos[link /reference/cstdio/fsetpos.md.nolink] +* std::fgetpos[link /reference/cstdio/fgetpos.md] +* std::fsetpos[link /reference/cstdio/fsetpos.md] * std::fopen[link /reference/cstdio/fopen.md] * std::fclose[link /reference/cstdio/fclose.md] * std::fgetc[link /reference/cstdio/fgetc.md] diff --git a/reference/cstdio/fsetpos.md b/reference/cstdio/fsetpos.md new file mode 100644 index 0000000000..f4650406f7 --- /dev/null +++ b/reference/cstdio/fsetpos.md @@ -0,0 +1,72 @@ +# fsetpos +* cstdio[meta header] +* std[meta namespace] +* function[meta id-type] + +```cpp +namespace std { + int fsetpos(FILE* stream, const fpos_t* pos); +} +``` + +## 概要 +ファイルの現在位置を設定する。 + +## 戻り値 +正常に実行されれば0を返す。 + +失敗した場合は、0以外を返し、エラーの内容は[`errno`](/reference/cerrno/errno.md)から参照することができる。 + +## この機能が必要になった背景・経緯 +かつては[`fseek`](/reference/cstdio/fseek.md.nolink)で位置を指定していたが、`fseek`は位置を`long int`で指定するため、非常に大きなファイルやマルチバイト文字を含む特殊なファイルでは正確にファイル位置を指定できないことがあった。 + +そこで、どのようなファイルでも位置を正確に表現できる`fpos_t`型が導入されたことに伴い、この関数が登場した。 + +## 例 +```cpp example +#include +#include + +int main() { + std::FILE *file = std::fopen("example.txt", "w"); + if (file == nullptr) { + std::perror("Failed to open file"); + return 1; + } + std::fpos_t current_pos; + std::fgetpos(file, ¤t_pos); + std::fputs("Hello, World!\n", file); + std::fsetpos(file, ¤t_pos); + std::fputs("h", file); + std::fclose(file); + file = std::fopen("example.txt", "r"); + if (file == nullptr) { + std::perror("Failed to open file"); + return 1; + } + int ch; + while ((ch = std::fgetc(file)) != EOF) { + std::putchar(ch); + } + std::fclose(file); + return 0; +} +``` +* std::fsetpos[color ff0000] +* std::fgetpos[link /reference/cstdio/fgetpos.md] +* std::fopen[link /reference/cstdio/fopen.md] +* std::fputs[link /reference/cstdio/fputs.md] +* std::fclose[link /reference/cstdio/fclose.md] +* std::perror[link /reference/cstdio/perror.md.nolink] +* std::fgetc[link /reference/cstdio/fgetc.md] +* std::putchar[link /reference/cstdio/putchar.md] + +## 出力 +``` +hello, World! +``` + +## 処理系 +- [Clang](/implementation.md#clang): ?? +- [GCC](/implementation.md#gcc): ?? +- [Visual C++](/implementation.md#visual_cpp): ?? diff --git a/reference/cstdio/ungetc.md b/reference/cstdio/ungetc.md index 12b998a399..dd27b639e1 100644 --- a/reference/cstdio/ungetc.md +++ b/reference/cstdio/ungetc.md @@ -16,7 +16,7 @@ namespace std { また、`c`は[`EOF`](/reference/cstdio/eof.md)であってはならない。 -この関数が呼び出されたのち、[`fseek`](/reference/cstdio/fseek.md.nolink)や[`fsetpos`](/reference/cstdio/fsetpos.md.nolink)、[`rewind`](/reference/cstdio/rewind.md.nolink)、[`fflush`](/reference/cstdio/fflush.md)を呼び出すと、その関数の呼び出しによって戻された文字は失われる。 +この関数が呼び出されたのち、[`fseek`](/reference/cstdio/fseek.md.nolink)や[`fsetpos`](/reference/cstdio/fsetpos.md)、[`rewind`](/reference/cstdio/rewind.md.nolink)、[`fflush`](/reference/cstdio/fflush.md)を呼び出すと、その関数の呼び出しによって戻された文字は失われる。 ## 戻り値 成功したら挿入した`c`を、そうでなければ[`EOF`](/reference/cstdio/eof.md)を返す。