LINUX错误提示函数

目录

1.perror()

功能:提示当前错误类型;

复制代码
#include <stdio.h>

void main(int argc, const char *argv[])
{
    //以只读方式打开文件
    int pt_err = 0;
    FILE * fp = fopen("/home/cat/115.c", "a");
    if(fp == NULL)
    {
        perror("fopen文件打开失败!");
        return -1;
    }
    else
    {
        printf("文件打开成功!\n");
    }

    if(EOF == (fputs("Hello World!\n", fp)))
    {
        perror("fputs写入失败!");
        return -1;
    }
    else
    {
        printf("写入成功!\n");
    }

    pt_err = fclose(fp);
    if(pt_err == EOF)
    {
        perror("fclose");
        return -1;
    }
    else
    {
        printf("文件关闭成功!");
    }
    return 0;
}

2.ferror()

功能: 检查文件是否因错误而终止;

1.ferror() 用于检测文件流的错误标志,参数为 FILE* 指针,返回非 0 表示上一次 I/O 操作出错,0 表示无错误。

2.ferror() 需与 feof() 配合使用:当读写操作返回 EOF 时,用两者区分 "正常到末尾" 和 "操作出错"。

3.错误标志具有 "粘性",需用 clearerr() 手动清除;配合 perror() 可打印具体错误原因,是定位问题的关键。

复制代码
#include <stdio.h>
#include <string.h>

int main(int argc, const char* argv[])
{
    FILE *fp;
    size_t fp_read;
    fp = fopen(argv[1], "rb");
    if(fp == NULL)
    {
        perror("文件打开失败!");
        return -1;
    }
    printf("文件打开成功!\n");
    /*
    检查是否到达文件结尾
    */
    if(feof(fp)) //非0读取到结尾
    {
        printf("读取到文件结尾!\n");
    }
    else if(ferror(fp)) //0未读取到结尾
    {
        printf("读取文件发生错误!\n");
        perror("错误详情:");
        clearerr(fp);  //不手动清除错误码状态不会改变
    }

    fclose(fp);
    return 0;
}

3. 手动清除错误码clearerr()

不手动清除错误码状态不会改变

4.feof函数

功能:

1.feof() 核心是检测文件流的 EOF 标志位,参数为 FILE* 类型文件指针,返回非 0 表示标志已置位、0 表示未置位。

2.正确用法是 "先读数据,再用读操作返回值终止循环,最后用 feof () 区分终止原因",切勿将 feof () 作为循环条件。

3.配合 ferror() 可定位读操作失败的真实原因,配合 clearerr() 可重置文件流的 EOF / 错误标志。

复制代码
#include <stdio.h>
#include <string.h>

int main(int argc, const char* argv[])
{
    FILE *fp;
    size_t fp_read;
    fp = fopen(argv[1], "rb");
    if(fp == NULL)
    {
        perror("文件打开失败!");
        return -1;
    }
    printf("文件打开成功!\n");
    char buf[1024] = {0};
    int cnt = 0;
    while((fp_read = fread(buf, 1, 1024, fp)) > 0)
    {
        cnt++;
        if(cnt > 1021)
        {
            cnt = 0;
        }
    }
    printf("%s\n", buf);
    /*
    检查是否到达文件结尾
    */
    if(feof(fp)) //非0读取到结尾
    {
        printf("读取到文件结尾!\n");
    }
    else         //0未读取到结尾
    {
        printf("未读取到文件结尾!!!\n");
    }
    fclose(fp);
    return 0;
}
相关推荐
Lyra_Infra几秒前
OpenClaw 服务异常故障分析报告
linux·人工智能
huainingning1 小时前
华三瘦AP切换为胖AP并配置无线功能
运维·网络·网络协议·tcp/ip
xywww1682 小时前
开发团队接入 Opus 5 / Sonnet 5:模型路由、升级阈值和成本账怎么算
服务器·网络·p2p
爱写代码的森2 小时前
鸿蒙三方库 | harmony-utils之EncryptUtil URL编解码详解
服务器·华为·harmonyos·鸿蒙·huawei
外滩运维专家2 小时前
十几台服务器要改配置,别再一台台 SSH 了
运维
风曦Kisaki2 小时前
Kubernetes(K8s)笔记Day03: Pod命名空间,标签,Pod 的调度,污点与容忍度,Pod 常见状态和重启策略,Pod 生命周期
linux·运维·笔记·docker·云原生·容器·kubernetes
千维百策6662 小时前
如何管理错误预算:提升服务可靠性与 SLO 达成率的实践经验
服务器·网络·数据库
图件制作GIS,储量计算2 小时前
未来已到,抓住机遇
运维·服务器
xuhe22 小时前
一劳永逸!解决 AutoDL 系统盘(30GB)爆满与 pip 缓存迁移
linux·python·ai·jupyter
CIO_Alliance2 小时前
AI+iPaaS解决方案:跨系统业务流程自动化助力企业AI化转型
运维·人工智能·自动化