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

有以下代码:

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

输出结果:

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, , SEEK_SET);
printf("%d\n", ftell(f1));
printf("code is:%x\n", 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, -, SEEK_SET);
printf("%d\n", ftell(f1));
printf("code is:%x\n", getc(f1));

输出:

0
code is:33
Press any key to continue

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

关于C语言中EOF的一点认识的更多相关文章

  1. C 语言中 setjmp 和 longjmp

    在 C 语言中,我们不能使用 goto 语句来跳转到另一个函数中的某个 label 处:但提供了两个函数——setjmp 和 longjmp来完成这种类型的分支跳转.后面我们会看到这两个函数在处理异常 ...

  2. C语言中malloc()和calloc()c函数用法

    C语言中malloc()和calloc()c函数用法   函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别. malloc()函数有一个参数,即要分配的内存空间的大小: ...

  3. (七)C语言中的void 和void 指针类型

    许多初学者对C中的void 和void 的指针类型不是很了解.因此常常在使用上出现一些错误,本文将告诉大家关于void 和void 指针类型的使用方法及技巧. 1.首先,我们来说说void 的含义: ...

  4. 转:C语言中的static变量和C++静态数据成员(static member)

    转自:C语言中的static变量和C++静态数据成员(static member) C语言中static的变量:1).static局部变量        a.静态局部变量在函数内定义,生存期为整个程序 ...

  5. c语言中的unsigned 和 signed

    我们来一起看下,C语言中,对于Integer Type(整数形式)的unsigned与signed两种形式的区别,以及在内存中的存储方式是如何的 Integer type(整数形式)是C语言中的基本数 ...

  6. C语言中fgetc、fputc和getc、putc的区别是什么

    看书的时候,发现了这四个函数,想知道他们的不同.结果上网查发现很多人说fgetc.fputc的f代表的是file,就是这两个函数是和文件有关的!但是一看他们的函数声明,如下图: 发现他们的参数里面都有 ...

  7. 对C语言中sizeof细节的三点分析

    转自对C语言中sizeof细节的三点分析 1.sizeof是运算符,跟加减乘除的性质其实是一样的,在编译的时候进行执行,而不是在运行时才执行. 那么如果编程中验证这一点呢?ps:这是前两天朋友淘宝面试 ...

  8. Java 语言中 Enum 类型的使用介绍

    Enum 类型的介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常 ...

  9. C/C++语言中const的用法

    1. const 在C和C++中的区别     C++中的const正常情况下是看成编译期的常量,编译器并不为const分配空间,只是在编译的时候将期值保存在名字表中,并在适当的时候折合在代码中. 所 ...

随机推荐

  1. Kafka学习笔记(4)----Kafka的Leader Election

    1. Zookeeper的基本操作 zookeeper中的节点可以持久化/有序的两个维度分为四种类型: PERSIST:持久化无序(保存在磁盘中) PERSIST_SEQUENTIAL:持久化有序递增 ...

  2. Python笔记13------pandas作图

    1.pandas可以用来画DataFrame和Series的图 如: import numpy as npimport matplotlib.pyplot as pltimport pandas as ...

  3. 内核如何检测SOFT LOCKUP与HARD LOCKUP?

    内核如何检测SOFT LOCKUP与HARD LOCKUP? From article 所谓lockup,是指某段内核代码占着CPU不放.Lockup严重的情况下会导致整个系统失去响应.Lockup有 ...

  4. C语言提高 (3) 第三天 二级指针的三种模型 栈上指针数组、栈上二维数组、堆上开辟空间

    1 作业讲解 指针间接操作的三个必要条件 两个变量 其中一个是指针 建立关联:用一个指针指向另一个地址 * 简述sizeof和strlen的区别 strlen求字符串长度,字符数组到’\0’就结束 s ...

  5. javascript事件列表解说

    javascript事件列表解说 事件 浏览器支持 解说 一般事件 onclick IE3.N2 鼠标点击时触发此事件 ondblclick IE4.N4 鼠标双击时触发此事件 onmousedown ...

  6. 2、Ansible配置文件详解

    0.配置文件 两个核心文件:ansible.cfg和hosts文件,默认都存放在/etc/ansible目录下. ansible.cfg:主要设置一些ansible初始化的信息,比如日志存放路径.模块 ...

  7. TP框架 mysql子查询

    一些比较复杂的业务关系,用子查询解决. 比循环便利要好的多哈. 比如下面这句 select 和where in 语句都用了子查询. 因为父查询在select里,所以用了select的字段当子查询的条件 ...

  8. Scrapy系列教程(6)------怎样避免被禁

    避免被禁止(ban) 有些网站实现了特定的机制,以一定规则来避免被爬虫爬取. 与这些规则打交道并不easy,须要技巧,有时候也须要些特别的基础. 假设有疑问请考虑联系 商业支持 . 以下是些处理这些网 ...

  9. SQL注入原理以及怎样避免注入

    SQL注入:究竟什么时候会用到SQL呢?回答是訪问数据库的时候.也就是说SQL注入-->直接威胁到了数据源,呵呵.数据库都收到了威胁,站点还能正常现实么? 所谓SQL注入,就是通过把SQL命令插 ...

  10. 命令模式之2 Invoker Vs. Client

    当程序中直接编写下达命令的语句如new Cmd1().execute()时.一般会将调用者与客户类合二为一. 在GUI程序中.下达命令的语句通常包括在底层框架中.或者说底层框架包括了调用者.这时程序猿 ...