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;
}
相关推荐
用户9718356334666 小时前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪8 小时前
linux 拷贝文件或目录到指定的位置
linux
大树881 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠1 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质1 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush41 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5201 天前
Linux 11 动态监控指令top
linux
小宇宙Zz1 天前
Maven依赖冲突
java·服务器·maven
Inhand陈工1 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智1 天前
ARP代理--工作原理
运维·网络·arp·arp代理