std::fgets

来自cppreference.com
< cpp‎ | io‎ | c
 
 
 
 
在标头 <cstdio> 定义
char* fgets( char* str, int count, std::FILE* stream );

从给定文件流读取最多 count - 1 个字符并将它们存储于 str 所指向的字符数组。若文件尾出现或发现换行符则终止分析,后一情况下 str 将包含一个换行符。若读入字节且无错误发生,则紧随写入到 str 的最后一个字符后写入空字符。

参数

str - 指向 char 数组元素的指针
count - 要写入的最大字符数(典型地为 str 的长度)
stream - 读取数据来源的文件流

返回值

成功时为 str,失败时为空指针。

若遇到文件尾条件导致了失败,则设置 stream 上的文件尾指示器(见 std::feof())。这仅若它导致未读取字符才是失败,该情况下返回空指针且不改变 str 所指向数组的内容(即不以空字符覆写首字节)。

若其他错误条件导致了失败,则设置 stream 上的错误指示器(见 std::ferror())。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 读取字符串
(函数)
写字符串到文件流
(函数)