C 风格文件输入/输出---错误处理---(std::clearerr,std::feof,std::ferror,std::perror)
C++ 标准库的 C I/O 子集实现 C 风格流输入/输出操作。 <cstdio> 头文件提供通用文件支持并提供有窄和多字节字符输入/输出能力的函数,而 <cwchar>头文件提供有宽字符输入/输出能力的函数。
错误处理
清除错误
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 ,要求处理 EOFwhile ((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;
}
输出
显示对应当前错误的字符串于 stderr
std::perror
void perror( const char *s ); |
打印当前存储于系统变量 errno 的错误码到 stderr 。
通过连接下列组分构成描述:
s
所指向的空终止字节字符串的内容后随 ": " (除非s
为空指针或s
所指向字符为空字符)- 实现定义的,描述存储于
errno
的错误码的错误消息字符串后随 '\n' 。错误消息字符串等同于 std::strerror(errno) 的结果。
参数
s | - | 指向拥有解释性消息的空终止字符串的指针 |
返回值
(无)
调用示例
#include <cmath>
#include <cerrno>
#include <cstdio>int main()
{double not_a_number = std::log(-1.0);if (errno == EDOM){std::perror("log(-1) failed");}return 0;
}