当前位置: 首页 > news >正文

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;
}

输出

http://www.lryc.cn/news/171901.html

相关文章:

  • mysql 主从复制 mysql版本5.7.35
  • iOS“超级签名”绕过App Store作弊解决方案
  • I2C子系统、读取温湿度的逻辑及代码
  • 数据结构——排序
  • 资深java面试题及答案整理
  • buuctf-[网鼎杯 2020 朱雀组]phpweb
  • SpringBoot实战(二十四)集成 LoadBalancer
  • 文件挂载nas挂载
  • 电影格式怎么转换mp4?电影格式转换教程
  • HarmonyOS之 组件的使用
  • IAM:身份验证与授权
  • Linux——vi编辑器
  • 【Linux学习笔记】权限
  • Aspose转pdf乱码问题
  • table中的td内部的元素不能与td等高的问题
  • Layui + Flask | 实现数据表格修改(案例篇)(09)
  • BCC源码编译和安装
  • linux上gitlab备份与还原
  • 【精华】具身智能:人工智能的下一个浪潮
  • 【线性回归、岭回归、Lasso回归分别预测患者糖尿病病情】数据挖掘实验一
  • 037:vue项目监听页面变化,动态设置iframe元素高度
  • 探索前端生成二维码技术:简单实用的实现方式
  • python装13的一些写法
  • 黑马JVM总结(十八)
  • Android调用相机拍照,展示拍摄的图片
  • 企业如何找媒体发稿能收录且不被拒稿,媒介盒子无偿分享
  • 利用cms主题构造木马(CVE-2022-26965)
  • 【MTK】【WFD】手机投屏到投影仪不显示画面
  • 多输入多输出 | MATLAB实现PSO-LSSVM粒子群优化最小二乘支持向量机多输入多输出
  • scrapyd-完整细节