• C语言文件操作函数之ferror & feof & clearerr


    这些函数都是和文件读写时发生错误有关,下面一一分析:

    1:ferror

    原型:int ferror(FILE * fp)

    作用:测试一个文件流是否被设置了错误标识符,如果是返回非 0 整数,否则返回 0。

    例子:

    short ch;
    FILE * f1;
    f1 = fopen("test.txt", "w");
    ch = fgetc(f1);
    //注意,我们以 只写 方式打开了文件,但是却尝试向该文件读取一个字符,肯定会操作失败,这时,该文件流就会被设置上错误标识符
    printf("%d
    ", ch);
    //这里输出 -1 ,因为当fgetc函数操作失败时返回 EOF,即 -1
    if(ferror(f1)){
         //用函数ferror测试文件流是否存在错误标识符
          printf("Have a error.
    ");
         //结果自然是,所以输出错误信息
    }
    fclose(f1);

    注意:每次发生不同的操作错误都会更新文件流上次保存的错误标识符,例如:先后发生了A和B两个文件操作错误,并且A错误的标识符为16,B错误的标识符为32,那么文件流保存的错误标识符就是 32,用ferror(fp)读取返回的结果就是 32。

    2:feof

    原型:int feof(FILE * fp)

    作用:测试一个文件流是否被设置了文件结束标识符,如果是返回非 0 整数,否则返回 0。

    例子:

    FILE * f1;
    short ch;
    f1 = fopen("utf8.txt", "r");
    /*
    此文件的十六进制结构为:
    31 22
    (共两个字节)
    */
    while(1){
        ch = getc(f1);
            //在第三次循环执行getc语句时,由于文件指针已经指向了EOF,所以这次getc函数读取EOF值(-1)之后,如果指针再向后偏移一位,就发现不指向任何有效的位置了(这时指针不会发生偏移了),所以这时文件流会被设置上文件结束标识符
        if (feof(f1)){
            break;
        }
        printf("%x
    ", ch);
    }
    fclose(f1);
    /*
    输出:
    31
    22
    Press any key to continue
    */

    注意:feof函数检测文件是否结束的方法很诡异,它不是检测当前文件指针是否指向EOF位置,而是检测EOF是否已经被读取出来了,就像上面代码的第三次循环,这时getc把EOF位置读取出来了,然后发现指针不能再向后面移动了,所以才给文件流设置上文件结束的标识。

    3:clearerr

    原型:void clearerr(FILE * fp)

    作用: 清除一个文件流的文件结束和错误标识符(即把文件结束符和错误标识符从非 0 值变成 0 值)。

    例子:

    FILE * f1;
    short ch;
    f1 = fopen("utf8.txt", "r");
    while(1){
        ch = getc(f1);
        if (feof(f1)){
            break;
        }
    }
    //上面循环结束之后,文件流已经被设置了文件结束标志
    printf("%d
    ", feof(f1)==0);
    //输出 0,说明feof返回非 0 值,即检测到文件已经到结束位置
    clearerr(f1);
    //清除文件流结束标志和错误标志
    printf("%d
    ", feof(f1)==0);
    //输出 1,说明feof返回 0 值,即检测到文件没到结束位置,虽然实际上已经到结束位置了
    fclose(f1);

    注意:调用文件指针重置函数rewind(原型:void rewind(FILE * fp)),也会清除文件流的结束标志。

  • 相关阅读:
    卷积池化函数
    keyring源码加密解密函数分析
    mysql语句批量产生大量测试数据
    InnoDB表存储结构及keyring加密
    cmake安装使用
    神经网络推导
    C#基础 集合
    C#基础 数组
    C#基础 类
    C#基础 for 穷举、迭代
  • 原文地址:https://www.cnblogs.com/ryzz/p/9362943.html
Copyright © 2020-2023  润新知