std::fgets
Defined in header <cstdio> |
||
|---|---|---|
char* fgets( char* str, int count, std::FILE* stream ); |
Читает не более count - 1 символов из заданного потока файла и сохраняет их в массив символов, на который указывает str. Парсинг останавливается, если обнаружен символ новой строки, в этом случае str будет содержать этот символ новой строки, или если достигнута конечная точка файла. Если байты прочитаны и не возникли ошибки, записывается нулевой символ в позицию сразу после последнего записанного символа в str.
Параметры
| str | - | указатель на элемент массива char |
| count | - | максимальное количество символов для записи (обычно длина str) |
| stream | - | поток файла для чтения данных |
Возвращаемое значение
str при успехе, указатель на null при ошибке.
Если обнаружено состояние конца файла, устанавливается индикатор eof в stream (см. std::feof()). Это ошибка только если не прочитано ни одного байта, в этом случае возвращается указатель на null и содержимое массива, на который указывает 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/w/cpp/io/c/fgets