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
См. также
считывает форматированный ввод из stdin, файлового потока или буфера (функция) |
|
|
(устарело в C++11)(удалено в C++14) | считывает строку символов из stdin (функция) |
| записывает строку символов в файловый поток (функция) |
|
Документация по C для fgets |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/c/fgets