std:: fgets
|
定义于头文件
<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 上设置错误指示器(参见 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 文档
for
fgets
|
|