博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于C语言中EOF的一点认识
阅读量:4952 次
发布时间:2019-06-12

本文共 1779 字,大约阅读时间需要 5 分钟。

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

有以下代码:

1 #include 
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\n", ftell(f1));24 printf("code is:%x\n", getc(f1)==EOF);25 printf("code is:%x\n", getc(f1)==EOF);26 printf("code is:%x\n", 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\n", 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\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, -2, 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,但是实际上并没有移动。

转载于:https://www.cnblogs.com/ryzz/p/9354396.html

你可能感兴趣的文章
Fireworks基本使用
查看>>
《代码整洁之道》学习记录
查看>>
C++深入理解虚函数
查看>>
c#线程学习笔记一---基本概念
查看>>
2018-4-13
查看>>
两台电脑间的消息传输
查看>>
Linux 标准 I/O 库
查看>>
Spring Data JPA教程, 第八部分:Adding Functionality to a Repository (未翻译)
查看>>
教练技术的小应用
查看>>
.net Tuple特性
查看>>
Java基础常见英语词汇
查看>>
iOS并发编程笔记【转】
查看>>
泛型 T的定义<1>
查看>>
thinkphp dispaly和fetch的区别
查看>>
08号团队-团队任务5:项目总结会
查看>>
mybatis 插入数据 在没有commit时 获取主键id
查看>>
SQL2005 删除空白行null
查看>>
lightoj 1030 概率dp
查看>>
重新注册.NET
查看>>
Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结
查看>>