Namespaces
Variants

std:: fgets

From cppreference.net
< cpp ‎ | io ‎ | c
ヘッダーで定義 <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 から文字列を読み込む
(関数)
ファイルストリームに文字列を書き込む
(関数)