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;
}
相关推荐
未济6 天前
linux 配置环境变量
linux
傲世仙尊6 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
虎头金猫6 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
_艾伦 耶格尔.6 天前
进程间通信
linux
AI职业加油站6 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
Liuqy-056 天前
Linux IO编程——静态库、动态库
linux
此冬歌咏6 天前
K8s 节点故障实战:优雅驱逐 31 秒,硬故障 331 秒,以及那个永远 Pending 的 Pod
运维·k8s
彧azz6 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
-梅6 天前
linux(8) 软硬链接
linux·运维·服务器
Wang's Blog6 天前
Java 项目实战: 外卖平台-文件下载与ServletOutputStream回写浏览器
服务器·项目开发