• C 风格文件输入/输出---错误处理---(std::clearerr,std::feof,std::ferror,std::perror)


    C++ 标准库的 C I/O 子集实现 C 风格流输入/输出操作。  头文件提供通用文件支持并提供有窄和多字节字符输入/输出能力的函数,而 头文件提供有宽字符输入/输出能力的函数。

    错误处理

    清除错误

    std::clearerr

    void clearerr( std::FILE* stream );

    重置给定文件流的错误标志和 EOF 指示器。

    参数

    stream-要重置错误标志的文件流

    返回值

    (无)

    调用示例

    1. #include <iostream>
    2. #include <cstdio>
    3. using namespace std;
    4. int main()
    5. {
    6. int ch = 0;
    7. FILE* fp = fopen("test.txt", "w");
    8. if (fp)
    9. {
    10. ch = std::getc(fp);
    11. std::printf("%c", ch);
    12. if (std::ferror(fp))
    13. {
    14. std::cout << "Error set" << std::endl;
    15. std::clearerr(fp);
    16. }
    17. }
    18. if (!std::ferror(fp))
    19. {
    20. std::cout << "Error reset" << std::endl;
    21. }
    22. std::fclose(fp);
    23. return 0;
    24. }

    输出

    检查文件尾

    std::feof

    int feof( std::FILE* stream );

    检查是否已抵达给定文件流的结尾。

    参数

    stream-要检查的文件流

    返回值

    若已抵达文件流尾则为非零值,否则为 ​0​ 。

    注意

    此函数只报告最近的 I/O 操作所报告的流状态,它不检验关联数据源。例如,若最近一次 I/O 是返回文件最后字节的 std::fgetc ,则 std::feof 返回零。下个 std::fgetc 失败并更改文件流为文件尾。只在这之后 std::feof 才返回非零。

    典型用法中,输入流在任何错误时停止处理;然后用 feof 和 std::ferror 区别不同的错误条件。

    调用示例

    1. #include <cstdio>
    2. #include <cstdlib>
    3. int main()
    4. {
    5. FILE* fp = std::fopen("test.txt", "r");
    6. if (!fp)
    7. {
    8. std::perror("File opening failed");
    9. return EXIT_FAILURE;
    10. }
    11. int c; // 注意:是 int 而非 char ,要求处理 EOF
    12. while ((c = std::fgetc(fp)) != EOF) // 标准 C I/O 文件读取循环
    13. {
    14. std::putchar(c);
    15. }
    16. if (std::ferror(fp))
    17. {
    18. std::puts("I/O error when reading");
    19. }
    20. else if (std::feof(fp))
    21. {
    22. std::puts("End of file reached successfully");
    23. }
    24. std::fclose(fp);
    25. return 0;
    26. }

     输出

    检查文件错误

    std::ferror

    int ferror( std::FILE* stream );

    检查给定的流的错误。

    参数

    stream-要检查的文件流

    返回值

    若文件流已出现错误则为非零值,否则为 ​0​ 。

    调用示例

    1. #include <cstdio>
    2. #include <cstdlib>
    3. #include <clocale>
    4. #include <cwchar>
    5. #include <iostream>
    6. int main(void)
    7. {
    8. const char *fname = std::tmpnam(nullptr);
    9. std::cout << "fname: " << fname << std::endl;
    10. std::FILE* f = std::fopen(fname, "wb");
    11. std::fputs("\xff\xff\n", f); // 不是合法的 UTF-8 字符序列
    12. std::fclose(f);
    13. std::setlocale(LC_ALL, "en_US.utf8");
    14. f = std::fopen(fname, "rb");
    15. std::wint_t ch;
    16. while ((ch = std::fgetc(f)) != WEOF) // 试图作为 UTF-8 读取
    17. {
    18. std::printf("%#x ", ch);
    19. }
    20. if (std::feof(f))
    21. {
    22. puts("EOF indicator set");
    23. }
    24. if (std::ferror(f))
    25. {
    26. puts("Error indicator set");
    27. }
    28. return 0;
    29. }

    输出

    显示对应当前错误的字符串于 stderr

    std::perror

    void perror( const char *s );

    打印当前存储于系统变量 errno 的错误码到 stderr 。

    通过连接下列组分构成描述:

    • s 所指向的空终止字节字符串的内容后随 ": " (除非 s 为空指针或 s 所指向字符为空字符)
    • 实现定义的,描述存储于 errno 的错误码的错误消息字符串后随 '\n' 。错误消息字符串等同于 std::strerror(errno) 的结果。

    参数

    s-指向拥有解释性消息的空终止字符串的指针

    返回值

    (无)

    调用示例

    1. #include
    2. #include
    3. #include
    4. int main()
    5. {
    6. double not_a_number = std::log(-1.0);
    7. if (errno == EDOM)
    8. {
    9. std::perror("log(-1) failed");
    10. }
    11. return 0;
    12. }

    输出

  • 相关阅读:
    C++操作ZEROMQ
    第9章 Mybatis
    3.16 haas506 2.0开发教程-example-JC035串口屏
    【数据结构初阶】单链表(附全部码源)
    记录vue配置跨域不起作用以及一些理解
    async,await总结
    Redis整理
    如何在Kubernetes中实现微服务应用监控?
    C++数据结构X篇_04_单向链表框架搭建、实现和测试(链表的定义,常用操作的实现等)
    用 TensorFlow API:tf.keras 搭建网络八股
  • 原文地址:https://blog.csdn.net/qq_40788199/article/details/132947978