在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
总结来说: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\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 被测试文件(ascii.txt)的十六进制结构为: 33 FF 55 另外,任何尝试读取非法的文件指针所指向的字符(字节)时都会返回 -1,如下代码所示: fseek(f1, 14, SEEK_SET); printf("%d\n", ftell(f1)); printf("code is:%x\n", getc(f1)); 输出: 14 解释:还是以"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 解释:第二个参数是 -2,应该从SEEK_SET位置向前移动两个字符,即ftell函数应该返回 -2,但是实际上并没有移动。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论