关于C语言中EOF的一点认识
总结来说: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的一点认识的更多相关文章
- C 语言中 setjmp 和 longjmp
在 C 语言中,我们不能使用 goto 语句来跳转到另一个函数中的某个 label 处:但提供了两个函数——setjmp 和 longjmp来完成这种类型的分支跳转.后面我们会看到这两个函数在处理异常 ...
- C语言中malloc()和calloc()c函数用法
C语言中malloc()和calloc()c函数用法 函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别. malloc()函数有一个参数,即要分配的内存空间的大小: ...
- (七)C语言中的void 和void 指针类型
许多初学者对C中的void 和void 的指针类型不是很了解.因此常常在使用上出现一些错误,本文将告诉大家关于void 和void 指针类型的使用方法及技巧. 1.首先,我们来说说void 的含义: ...
- 转:C语言中的static变量和C++静态数据成员(static member)
转自:C语言中的static变量和C++静态数据成员(static member) C语言中static的变量:1).static局部变量 a.静态局部变量在函数内定义,生存期为整个程序 ...
- c语言中的unsigned 和 signed
我们来一起看下,C语言中,对于Integer Type(整数形式)的unsigned与signed两种形式的区别,以及在内存中的存储方式是如何的 Integer type(整数形式)是C语言中的基本数 ...
- C语言中fgetc、fputc和getc、putc的区别是什么
看书的时候,发现了这四个函数,想知道他们的不同.结果上网查发现很多人说fgetc.fputc的f代表的是file,就是这两个函数是和文件有关的!但是一看他们的函数声明,如下图: 发现他们的参数里面都有 ...
- 对C语言中sizeof细节的三点分析
转自对C语言中sizeof细节的三点分析 1.sizeof是运算符,跟加减乘除的性质其实是一样的,在编译的时候进行执行,而不是在运行时才执行. 那么如果编程中验证这一点呢?ps:这是前两天朋友淘宝面试 ...
- Java 语言中 Enum 类型的使用介绍
Enum 类型的介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常 ...
- C/C++语言中const的用法
1. const 在C和C++中的区别 C++中的const正常情况下是看成编译期的常量,编译器并不为const分配空间,只是在编译的时候将期值保存在名字表中,并在适当的时候折合在代码中. 所 ...
随机推荐
- shell学习第二弹-进阶
1.linux系统中配置文件执行顺序 1)用户登录系统,首页调用/etc/profile文件初始化所有bash用户的默认特征 2)然后shell依次查找~/.bash_profile,~/.bash_ ...
- 写给VC++ Windows开发的初学者 一片不错的博文
不知不觉2010年都过了半年了,想来我学C语言已经12个年头了(从1998年开始),用VC++也有11年了,最早使用Turbo C2.0 ,也学过汇编,后来使用Borland C++3.0 .Micr ...
- win 2016 添加系统组件注册表,
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ServerManager\ServicingS ...
- python tips:文件读取——换行符的问题
问题:在windows系统中,换行的符号是'\r\n'.python在读文件的时候为了系统兼容,会默认把'\r','n','\r\n'都视作换行.但是在windows文件中,可能在同一行中同时存在'\ ...
- timeval的时间转换成毫秒之后多大的数据类型可以装下
struct timeval { long tv_sec; /*秒*/ long tv_usec; /*微秒*/ }; 秒的定义为long,为了防止溢出,转换成毫秒之后保存在long long中
- Project Euler 2 Even Fibonacci numbers
题意:斐波那契数列中的每一项都是前两项的和.由1和2开始生成的斐波那契数列前10项为:1, 2, 3, 5, 8, 13, 21, 34, 55, 89, -考虑该斐波那契数列中不超过四百万的项,求其 ...
- awk的总结
入门总结 Awk简介 awk不仅仅时linux系统中的一个命令,而且是一种编程语言,可以用来处理数据和生成报告.处理的数据可以是一个或多个文件,可以是来自标准输入,也可以通过管道获取标准输入,awk可 ...
- C++调用C#编写的DLL【转】
1.打开VS新建项目 2.在新建项目窗口中选择其他语言->Visual C++->Win 32控制台应用程序,设置名称:MathCon,设置解决方案名:MathCon,这个名字随便你自己取 ...
- mybatis入门截图总结
原生态jdbc存在的问题 ------------------- ----------------------- ------- 环境的搭建 ----------------------------- ...
- SSH框架整合截图(二)
客户拜访管理 1 什么是客户拜访 (1)客户:与公司有业务往来的 (2)用户:可以使用系统的人 2 用户和客户关系 (1)用户和客户之间是拜访的关系 (2)用户 和 客户 是 多对多关系 ** 一个用 ...