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;
}
相关推荐
加农炮手Jinx10 小时前
Flutter for OpenHarmony: Flutter 三方库 icon_font_generator 自动化将 SVG 图标集转化为字体文件(鸿蒙矢量资源全自动管理)
运维·flutter·华为·自动化·harmonyos·devops
我真的想 啸10 小时前
在 Ubuntu 24.04 系统上安装并使用 Codex CLI
linux·ubuntu·arcgis
雨大王51214 小时前
汽车生产智能计划助手如何提升排产效率并降低库存积压?
大数据·运维
嵌入小生00714 小时前
线程(2)/ 线程属性 /相关函数接口--- 嵌入式(Linux)
linux·嵌入式·线程·软件编程·僵尸线程·马年开工第一学·线程属性
以太浮标14 小时前
华为eNSP综合实验之- 3a认证配置案例及解析(AAA认证)
运维·tcp/ip·网络安全·华为·信息与通信
No8g攻城狮14 小时前
【Linux】Linux nano 编辑器全攻略:从入门到精通
linux·运维·编辑器·nano
zl_dfq14 小时前
Linux 之 【网络套接字编程】(固定宽度整数类型、socket常见API、netstat)
linux·网络
2301_8059629315 小时前
arduino IDE如何设置代理
运维·服务器
shughui16 小时前
Docker Desktop下载、安装、配置、使用
运维·docker·容器·自动化
huaweichenai17 小时前
Linux安装http-server并部署html静态站点
linux·运维·服务器