std::fgets(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸ’… std::fgets πŸ’…

okay so bestie, this is std::fgets from the C++ Standard Libary β€” yes, that spelling is literally on the page, preserving the vibe ✨. It’s a C++ standard library function, and it’s here to read a line-ish chunk from a file stream into a char array. Buckle up, it’s giving vintage C I/O but make it cute. πŸŽ€

🌸 NAME 🌸

  • std::fgets β€” std::fgets

πŸ¦‹ Synopsis πŸ¦‹

Defined in header <cstdio>:

char* fgets( char* str, int count, std::FILE* stream );

Reads at most count - 1 characters from the given file stream and stores them in the character array pointed to by str. Parsing stops if a newline character is found β€” in which case str will contain that newline character β€” or if end-of-file occurs. If bytes are read and no errors occur, writes a null character at the position immediately after the last character written to str. Slay. πŸ’–

🌈 Parameters 🌈

  • str β€” pointer to an element of a char array.
  • count β€” maximum number of characters to write (typically the length of str).
  • stream β€” file stream to read the data from.

πŸ”₯ Return value πŸ”₯

str on success, null pointer on failure. Fr fr.

If the end-of-file condition is encountered, sets the eof indicator on stream (see std::feof()). This is only a failure if it causes no bytes to be read, in which case a null pointer is returned and the contents of the array pointed to by str are not altered (i.e. the first byte is not overwritten with a null character). No cap.

If the failure has been caused by some other error, sets the error indicator (see std::ferror()) on stream. The contents of the array pointed to by str are indeterminate (it may not even be null-terminated). 😭

🧚 Notes 🧚

POSIX additionally requires that fgets sets errno if it encounters a failure other than the end-of-file condition. Bestie, that’s POSIX doing extra credit. πŸ’…

Although the standard specification is unclear in the cases where count <= 1, common implementations do:

  • if count < 1, do nothing, report error,
  • if count == 1,
    • some implementations do nothing, report error,
    • others read nothing, store zero in str[0], report success.

πŸŽ€ Example πŸŽ€

// Run this code

#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);
}

πŸ“ Output πŸ“

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

πŸ‘‘ See also πŸ‘‘

  • scanf β€” reads formatted input from stdin, a file stream or a buffer.
  • fscanf β€” (function).
  • sscanf
  • gets β€” reads a character string from stdin (deprecated in C++11) (function) (removed in C++14).
  • fputs β€” writes a character string to a file stream (function).
  • C documentation for fgets

xoxo, your fave manual page πŸ’– β€” source: http://cppreference.com, version/date: 2024.06.10, page: std::fgets(3). Mwah! πŸ’‹

πŸ“¦ where this page comes from