Spec-Zone.ru › C

fgets

Определено в заголовке <stdio.h>
char *fgets( char          *str, int count, FILE          *stream );
(до C99)
char *fgets( char *restrict str, int count, FILE *restrict stream );
(с C99)

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

Параметры

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

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

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

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

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

Примечания

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

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

  • если count < 1, ничего не делают, сообщают об ошибке
  • если count == 1,
    • некоторые реализации ничего не делают, сообщают об ошибке,
    • другие ничего не читают, сохраняют ноль в str[0], сообщают об успехе

Пример

#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    FILE* tmpf = tmpfile();
    fputs("Alan Turing\n", tmpf);
    fputs("John von Neumann\n", tmpf);
    fputs("Alonzo Church\n", tmpf);
 
    rewind(tmpf);
 
    char buf[8];
    while (fgets(buf, sizeof buf, tmpf) != NULL)
          printf("\"%s\"\n", buf);
 
    if (feof(tmpf))
       puts("End of file reached");
}

Вывод:

"Alan Tu"
"ring
"
"John vo"
"n Neuma"
"nn
"
"Alonzo "
"Church
"
End of file reached

Ссылки

  • Стандарт C17 (ISO/IEC 9899:2018):
    • 7.21.7.2 Функция fgets (с. 241)
  • Стандарт C11 (ISO/IEC 9899:2011):
    • 7.21.7.2 Функция fgets (с. 331)
  • Стандарт C99 (ISO/IEC 9899:1999):
    • 7.19.7.2 Функция fgets (с. 296)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
    • 4.9.7.2 Функция fgets

См. также

scanffscanfsscanfscanf_sfscanf_ssscanf_s
(C11)(C11)(C11)
считывает форматированный ввод из stdin, потока файла или буфера
(функция)
getsgets_s
(удалена в C11)(C11)
считывает строку символов из stdin
(функция)
fputs
записывает строку символов в поток файла
(функция)
getlinegetwlinegetdelimgetwdelim
(dynamic memory TR)
считывает из потока в автоматически изменяемый буфер до разделителя/конца строки
(функция)
Документация C++ для fgets

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

Spec-Zone.ru

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