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

2023-09-17 18:07:34
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 ,要求处理 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;
}

输出

更多推荐

Linux sed

1.sed介绍sed:StreamEditor,流编辑器、行编辑器、逐行编辑sed将每行内容读入到“内存”中,在内存中进行处理,将结果返回给屏幕,此段内存空间称为模式空间。sed默认不编辑原文件,仅对模式空间的数据进行处理,处理结束后,将模式空间的内容显示到屏幕2.sed语法sed命令的语法格式sed[option]s

2023研究生数学建模竞赛A题B题C题D题E题F题思路+模型+代码

目录1.A题B题C题D题E题F题思路模型:9.22早上比赛开始后,第一时间更新,获取见文末名片2.竞赛注意事项:包括比赛流程,任务分配,时间把控,论文润色,已经发布在文末名片中3.常用国赛数学建模算法3.1分类问题3.2优化问题4.获取赛题思路模型见此名片1.A题B题C题D题E题F题思路模型:9.22早上比赛开始后,第

【Java】泛型 之 使用泛型

使用ArrayList时,如果不定义泛型类型时,泛型类型实际上就是Object://编译器警告:Listlist=newArrayList();list.add("Hello");list.add("World");Stringfirst=(String)list.get(0);Stringsecond=(String

MySQL 锁机制

文章目录MySQL锁机制1、什么是锁2、锁的缺点3、锁的分类3.1表级锁(1)什么是表级锁(2)读锁(3)写锁(4)读锁和写锁的总结(5)表级锁的优点和缺点(6)表级锁优缺点总结3.2行级锁(1)什么是行级锁(2)读锁`S`(3)写锁(4)意向共享锁`IS`(5)意向排他锁`IX`(6)行级锁的优点和缺点(7)行级锁的

【MySQL】索引

索引索引是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查询算法,这种数据结构就是索引。优缺点:优点:提高数据检索效率,降低数据库的IO成本通过索引列对数据进行排序,降低数据排序的成本,降

安卓桌面记事本便签软件哪个好用?

日常生活及工作中,很多人常常会遇到一些一闪而现的灵感,这时候拿出手机想要记录时,却找不到记录的软件。在这个快节奏的时代,安卓手机是我们日常生活不可或缺的伙伴。然而,正因为我们的生活如此忙碌,记事变得尤为重要。无论是备忘、计划、灵感还是简单的笔记,都需要一个方便而强大的工具。所以问题来了,安卓桌面记事本便签软件中哪个才是

气传导与入耳式传导区别?气传导耳机好用吗?

​入耳式耳机隔音效果好,但佩戴舒适性差,音质更偏向沉浸式。相比传统入耳式耳机,气传导耳机可以提供开放的听觉体验,音质更加自然真实,同时避免了长时间佩戴耳机可能会带来的不适感。以下是我总结了最好用的几款气传导耳机,看看有没有喜欢的。Top1:NANK南卡00压开放式耳机点评:开放式音频“技术之王”,音质与舒适最好的开放式

链表oj题1(Leetcode)——移除链表元素,反转链表,链表的中间节点,

链表OJ一,移除链表元素1.1分析1.2代码二,找到链表的中间节点2.1分析2.2代码三,反转链表3.1分析3.2代码四,找到链表中倒数第k个节点4.1分析4.2代码一,移除链表元素移除链表元素1.1分析这里的删除要分成两种情况来考虑,因为这个题目给了我们头节点,所以分成头删和非头删。因为要记录下一个节点的位置,所以1

ceph分布式存储

目录前言一、概述(一)、特点(二)、组件(三)、架构图二、搭建(一)、基础环境(二)、准备工作(三)、ceph安装(四)、集群构建(五)、dashboard安装(六)、ceph文件系统创建(七)、客户端挂载总结前言Ceph项目最早起源于Sage就读博士期间的工作(最早的成果于2004年发表),并随后贡献给开源社区。在经

【SLAM】10.纵观SLAM,对比方案和未来方向

"天下谁人配白衣”SLAM方案研究方向SLAM方案站在历史角度,看一下为SLAM的发展带来贡献的方案:2007年—A.J.Davison—MonoSLAM视觉SLAM的先驱,建立在EKF基础上,此前基本无法在线运行,意义较大;应用场景窄;2007—Klein—PTAM也是SLAM重要事件:双线程结构;跟踪部分实时响应,

UI设计师的工作职责 优漫动游

五、思维导图软件:MindManager或XMindMindManager或XMind都为思维导图软件,具体使用哪个软件并不重要,根据个人习惯就行。思维导图想必大家在进行策划分析和头脑风暴时,都用过。在UI设计中,也是经常用到。优途UI设计培训中特开设该课程就是主要用来整理产品需求思路、产品架构、产品的交互逻辑等等。总

热文推荐