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