命名空间
变体
操作

std::fgets

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

从给定的文件流中读取最多 count - 1 个字符,并将它们存储在 str 指向的字符数组中。如果遇到换行符,解析停止,在这种情况下,str 将包含该换行符,或者如果遇到文件结尾。如果读取了字节且没有发生错误,则在写入到 str 的最后一个字符之后的位

内容

[编辑] 参数

str - 指向字符数组元素的指针
count - 要写入的最大字符数(通常是 str 的长度)
stream - 要从中读取数据的文件流

[编辑] 返回值

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

如果遇到文件结尾条件,则在 stream 上设置 eof 指示器(请参阅 std::feof())。这只有在它导致没有字节被读取的情况下才算作失败,在这种情况下,将返回一个 NULL 指针,并且 str 指向的数组的内容不会被改变(即第一个字节不会被覆盖为空字符)。

如果失败是由其他错误引起的,则在 stream 上设置 error 指示器(请参阅 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 读取字符字符串
(函数) [编辑]
将字符字符串写入文件流
(函数) [编辑]
C 文档fgets