C++ 标准库的 C I/O 子集实现 C 风格流输入/输出操作。头文件提供通用文件支持并提供有窄和多字节字符输入/输出能力的函数,而 头文件提供有宽字符输入/输出能力的函数。
std::clearerr
| void clearerr( std::FILE* stream ); |
重置给定文件流的错误标志和 EOF 指示器。
| stream | - | 要重置错误标志的文件流 |
(无)
- #include <iostream>
- #include <cstdio>
-
- using namespace std;
-
- int main()
- {
- int ch = 0;
- FILE* fp = fopen("test.txt", "w");
-
- if (fp)
- {
- ch = std::getc(fp);
- std::printf("%c", ch);
-
- if (std::ferror(fp))
- {
- std::cout << "Error set" << std::endl;
- std::clearerr(fp);
- }
- }
-
- if (!std::ferror(fp))
- {
- std::cout << "Error reset" << std::endl;
- }
-
- std::fclose(fp);
- return 0;
- }

std::feof
| int feof( std::FILE* stream ); |
检查是否已抵达给定文件流的结尾。
| stream | - | 要检查的文件流 |
若已抵达文件流尾则为非零值,否则为 0 。
此函数只报告最近的 I/O 操作所报告的流状态,它不检验关联数据源。例如,若最近一次 I/O 是返回文件最后字节的 std::fgetc ,则 std::feof 返回零。下个 std::fgetc 失败并更改文件流为文件尾。只在这之后 std::feof 才返回非零。
典型用法中,输入流在任何错误时停止处理;然后用 feof 和 std::ferror 区别不同的错误条件。
- #include <cstdio>
- #include <cstdlib>
-
- int main()
- {
- FILE* fp = std::fopen("test.txt", "r");
- if (!fp)
- {
- std::perror("File opening failed");
- return EXIT_FAILURE;
- }
-
- int c; // 注意:是 int 而非 char ,要求处理 EOF
- while ((c = std::fgetc(fp)) != EOF) // 标准 C I/O 文件读取循环
- {
- std::putchar(c);
- }
-
- if (std::ferror(fp))
- {
- std::puts("I/O error when reading");
- }
- else if (std::feof(fp))
- {
- std::puts("End of file reached successfully");
- }
-
- std::fclose(fp);
- return 0;
- }

std::ferror
| int ferror( std::FILE* stream ); |
检查给定的流的错误。
| stream | - | 要检查的文件流 |
若文件流已出现错误则为非零值,否则为 0 。
- #include <cstdio>
- #include <cstdlib>
- #include <clocale>
- #include <cwchar>
- #include <iostream>
-
- int main(void)
- {
- const char *fname = std::tmpnam(nullptr);
- std::cout << "fname: " << fname << std::endl;
- std::FILE* f = std::fopen(fname, "wb");
- std::fputs("\xff\xff\n", f); // 不是合法的 UTF-8 字符序列
- std::fclose(f);
-
- std::setlocale(LC_ALL, "en_US.utf8");
- f = std::fopen(fname, "rb");
- std::wint_t ch;
- while ((ch = std::fgetc(f)) != WEOF) // 试图作为 UTF-8 读取
- {
- std::printf("%#x ", ch);
- }
-
- if (std::feof(f))
- {
- puts("EOF indicator set");
- }
-
- if (std::ferror(f))
- {
- puts("Error indicator set");
- }
-
- return 0;
- }

std::perror
| void perror( const char *s ); |
打印当前存储于系统变量 errno 的错误码到 stderr 。
通过连接下列组分构成描述:
s 所指向的空终止字节字符串的内容后随 ": " (除非 s 为空指针或 s 所指向字符为空字符)errno 的错误码的错误消息字符串后随 '\n' 。错误消息字符串等同于 std::strerror(errno) 的结果。| s | - | 指向拥有解释性消息的空终止字符串的指针 |
(无)
- #include
- #include
- #include
-
- int main()
- {
- double not_a_number = std::log(-1.0);
- if (errno == EDOM)
- {
- std::perror("log(-1) failed");
- }
- return 0;
- }
