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;
}
相关推荐
未来可期LJ2 小时前
【Linux 系统】进程间的通信方式
linux·服务器
Abona2 小时前
C语言嵌入式全栈Demo
linux·c语言·面试
心理之旅2 小时前
高校文献检索系统
运维·服务器·容器
Lenyiin2 小时前
Linux 基础IO
java·linux·服务器
The Chosen One9852 小时前
【Linux】深入理解Linux进程(一):PCB结构、Fork创建与状态切换详解
linux·运维·服务器
大佐不会说日语~3 小时前
使用Docker Compose 部署时网络冲突问题排查与解决
运维·网络·spring boot·docker·容器
Kira Skyler3 小时前
eBPF debugfs中的追踪点format实现原理
linux
2501_927773074 小时前
uboot挂载
linux·运维·服务器
wdfk_prog4 小时前
[Linux]学习笔记系列 -- [drivers][dma]dmapool
linux·笔记·学习