错误处理
清除错误
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;
}
输出
显示对应当前错误的字符串于 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;
}