zoukankan      html  css  js  c++  java
  • 关于C语言中EOF的一点认识

    总结来说:EOF(即End Of File)是一个文件结束的标记,当文件被读取到EOF位置时,参与读取的函数会返回整型值 -1,这时要注意的是:这个值被赋值给有符号char类型时是0xff,被赋值给有符号short时是0x00ff,有符号int即0x000000ff。

    有以下代码:

     1 #include <stdio.h>
     2 struct student{
     3     char name[5];
     4     char sex;
     5     short age;
     6 };
     7 int main(){
     8     FILE * f1, * f2;
     9     unsigned int count;
    10     short ch;
    11 
    12     count = 0;
    13 
    14     f1 = fopen("ascii.txt", "rb");
    15     ch=fgetc(f1);
    16     while (ch!=EOF){
    17         count++;
    18         ch = fgetc(f1);
    19         //可以看到被测试文件的第二个字符是FF,它以有符号char类型保存时值是-1,与EOF值相符,如果变量ch类型是有符号char就会出现结束循环,导致错误的计数
    20         //然而这里的ch类型是有符号short,当FF赋值给有符号short类型时是0x00FF,它的值是255,所以不与EOF(-1)相符,可以正常计数
    21     }
    22     fseek(f1, 2, SEEK_SET);
    23     printf("%d
    ", ftell(f1));
    24     printf("code is:%x
    ", getc(f1)==EOF);
    25     printf("code is:%x
    ", getc(f1)==EOF);
    26     printf("code is:%x
    ", getc(f1));
    27     //最后一个getc(f1)输出为八个f,原因很简单,因为这时候已经取到了EOF,而EOF的值是-1,所以这时getc返回-1,C语言中整型直接常量的类型是有符号int,所以就得到了有符号int类型的0xffffffff(它的值就是-1)
    28 
    29     fclose(f1);
    30 
    31     printf("total btyes:%ld
    ", count);
    32 
    33     return 1;
    34 }

    输出结果:

    2
    code is:0
    code is:1
    code is:ffffffff
    total btyes:3
    Press any key to continue

    被测试文件(ascii.txt)的十六进制结构为:

    33 FF 55

    另外,任何尝试读取非法的文件指针所指向的字符(字节)时都会返回 -1,如下代码所示:

    fseek(f1, 14, SEEK_SET);
    printf("%d
    ", ftell(f1));
    printf("code is:%x
    ", getc(f1));

    输出:

    14
    code is:ffffffff
    Press any key to continue

    解释:还是以"ascii.txt"为例,fseek移到了非法的位置 14 时(因为一共就0, 1, 2三个位置),getc函数返回-1。

    最后:fseek函数需要注意的是(SEEK_SET, CUR, END结果都相同,SEEK_END指向的是文件的EOF位置),它不会把文件指针移到位置 0 之前(如下代码所示),但是能移到EOF位置之后(如上代码所示):

    fseek(f1, -2, SEEK_SET);
    printf("%d
    ", ftell(f1));
    printf("code is:%x
    ", getc(f1));

    输出:

    0
    code is:33
    Press any key to continue

    解释:第二个参数是 -2,应该从SEEK_SET位置向前移动两个字符,即ftell函数应该返回 -2,但是实际上并没有移动。

  • 相关阅读:
    oracle常用sql语句
    Oracle存储过程基本语法介绍
    优美的代码:do...while(0)
    半同步半异步线程池
    C11线程管理:异步操作
    C11线程管理:原子变量&单调函数
    C11线程管理:条件变量
    C11线程管理:互斥锁
    C11线程管理:线程创建
    C11关键字&字面值改善
  • 原文地址:https://www.cnblogs.com/ryzz/p/9354396.html
Copyright © 2011-2022 走看看