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 .

Содержание

Параметры

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

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

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

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

Если сбой был вызван какой-либо другой ошибкой, устанавливает индикатор ошибки (см. 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

Смотрите также

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