std:: fgets
|
ヘッダーで定義
<cstdio>
|
||
|
char
*
fgets
(
char
*
str,
int
count,
std::
FILE
*
stream
)
;
|
||
指定されたファイルストリームから最大 count - 1 文字を読み取り、 str が指す文字配列に格納します。改行文字が見つかった場合(この場合 str にはその改行文字が含まれます)、またはファイル終端に達した場合に解析は停止します。バイトが読み取られ、エラーが発生しなかった場合、 str に書き込まれた最後の文字の直後の位置にnull文字を書き込みます。
目次 |
パラメータ
| str | - | char配列の要素へのポインタ |
| count | - | 書き込む最大文字数(通常は str の長さ) |
| stream | - | データを読み取るファイルストリーム |
戻り値
str 成功時は文字列ポインタ、失敗時はnullポインタを返します。
ファイル終端条件が発生した場合、 eof インジケータを stream に設定する( std::feof() を参照)。これはバイトが読み取られなかった場合にのみ失敗となり、その場合はヌルポインタが返され、 str が指す配列の内容は変更されない(すなわち、先頭バイトがナル文字で上書きされない)。
失敗が他の何らかのエラーによって引き起こされた場合、 error インジケータ( std::ferror() 参照)を stream に設定します。 str が指す配列の内容は不定です(null終端されていない可能性もあります)。
注記
POSIXはさらに
、
fgets
がファイル終端状態以外の障害に遭遇した場合に
errno
を設定することを要求します。
標準仕様は 不明確 ですが、 count <= 1 の場合、一般的な実装では
- count count < 1 の場合、何もせず、エラーを報告
- count count == 1 の場合、
-
- 一部の実装は何も行わず、エラーを報告します。
- 他の実装は何も読み込まず、 str [ 0 ] にゼロを格納し、成功を報告します。
例
#include <cstdio> #include <cstdlib> #include <iomanip> #include <iostream> #include <span> void dump(std::span<const char> buf, std::size_t offset) { std::cout << std::dec; for (char ch : buf) std::cout << (ch >= ' ' ? ch : '.'), offset--; std::cout << std::string(offset, ' ') << std::hex << std::setfill('0') << std::uppercase; for (unsigned ch : buf) std::cout << std::setw(2) << ch << ' '; std::cout << std::dec << '\n'; } int main() { std::FILE* tmpf = std::tmpfile(); std::fputs("Alan Turing\n", tmpf); std::fputs("John von Neumann\n", tmpf); std::fputs("Alonzo Church\n", tmpf); std::rewind(tmpf); for (char buf[8]; std::fgets(buf, sizeof buf, tmpf) != nullptr;) dump(buf, 10); }
出力:
Alan Tu. 41 6C 61 6E 20 54 75 00 ring..u. 72 69 6E 67 0A 00 75 00 John vo. 4A 6F 68 6E 20 76 6F 00 n Neuma. 6E 20 4E 65 75 6D 61 00 nn..uma. 6E 6E 0A 00 75 6D 61 00 Alonzo . 41 6C 6F 6E 7A 6F 20 00 Church.. 43 68 75 72 63 68 0A 00
関連項目
|
フォーマットされた入力を
stdin
、ファイルストリーム、またはバッファから読み込む
(関数) |
|
|
(C++11で非推奨)
(C++14で削除)
|
stdin
から文字列を読み込む
(関数) |
|
ファイルストリームに文字列を書き込む
(関数) |
|
|
Cドキュメント
for
fgets
|
|