Spec-Zone.ru › C++

std::fgets

Определён в заголовочном файле <cstdio>
char* fgets( char* str, int count, std::FILE* stream );

Считывает не более count - 1 символов из указанного файлового потока и сохраняет их в массиве символов, на который указывает str. Чтение прекращается, если встречается символ новой строки; в этом случае str будет содержать этот символ новой строки, либо при достижении конца файла. Если байты были считаны и ошибок не возникло, записывает нулевой символ сразу после последнего символа, записанного в str.

Параметры

str - указатель на элемент массива char
count - максимальное количество символов для записи (обычно длина str)
stream - файловый поток, из которого считываются данные

Возвращаемое значение

str при успехе, нулевой указатель при ошибке.

При достижении конца файла устанавливает индикатор eof для stream (см. std::feof()). Это считается ошибкой, только если из-за этого не было считано ни одного байта; в таком случае возвращается нулевой указатель, а содержимое массива, на который указывает str, не изменяется (то есть первый байт не перезаписывается нулевым символом).

Если ошибка вызвана другой причиной, устанавливает индикатор error (см. std::ferror()) для stream. Содержимое массива, на который указывает str, не определено (он может даже не завершаться нулевым символом).

Примечания

POSIX дополнительно требует, чтобы fgets устанавливала errno при возникновении ошибки, отличной от достижения конца файла.

Хотя формулировка стандарта неясна для случаев, когда count <= 1, распространённые реализации

  • если count < 1, ничего не делают и сообщают об ошибке,
  • если 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

См. также

scanffscanfsscanf
считывает форматированный ввод из stdin, файлового потока или буфера
(функция)
gets
(устарело в C++11)(удалено в C++14)
считывает строку символов из stdin
(функция)
fputs
записывает строку символов в файловый поток
(функция)
Документация по C для fgets

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/c/fgets

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API