std::fgets
来自 cppreference.cn
定义于头文件 <cstdio> |
||
char* fgets( char* str, int count, std::FILE* stream ); |
||
从给定的文件流中读取最多 count - 1 个字符,并将它们存储在 str 指向的字符数组中。如果找到换行符,解析将停止,在这种情况下,str 将包含该换行符;或者如果遇到文件结束。如果读取了字节且未发生错误,则在写入 str 的最后一个字符后的位置写入一个空字符。
目录 |
[编辑] 参数
str | - | 指向字符数组元素的指针 |
count | - | 要写入的最大字符数(通常是 str 的长度) |
stream | - | 从中读取数据的文件流 |
[编辑] 返回值
成功时返回 str,失败时返回空指针。
如果遇到文件结束条件,则设置 stream 上的 eof 指示符(参见 std::feof())。仅当它导致没有字节被读取时才视为失败,在这种情况下,返回空指针,并且 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
|