EOF

EOF<stdio.h>中的宏定义,EOF(End Of File)是一个与标准输入/输出流相关联的标志位。当文件指针已经指向文件尾且再次尝试读取时,EOF标志会被设置。同时,某些函数会在读取到文件尾(即EOF标志被设置)时返回EOF作为标识。

1
2
3
4
5
6
7
8
/* Buffered I/O macros */
#define BUFSIZ 512

// ......

#define EOF (-1)

// ......

在操作系统中,文件以文件存储占用的扇区数作为文件大小的计数单位,故而如果文件的大小不能恰好填满存储文件的最后一个扇区,则需要对该扇区剩余的空间进行填充,过去填充使用的是值为26(0x1a)的字节,也就是某些系统中 Ctrl+Z 的对应码值。

EOF 函数

getchar()

getchar()的返回值与EOF进行比较,如果不相同,说明还没有到达文件结尾。

在Unix系统中,可以通过在一行开始键入Ctrl+D来从键盘模拟文件结束条件;windows系统则使用Ctrl+Z来达到这个目的。

1
while ((ch = getchar ()) != EOF)

scanf()

scanf()函数返回一个整数值,这个值是成功读取的项目数,或者当遇到文件结束时返回一个EOF(文件结尾符)。

1
while (scanf ("%d", &n) != EOF)

fclose()

fclose()函数 如果成功返回 0,否则返回EOF(-1)。

getc()

如果读入字符时发现已经到达文件结尾,getc()会返回一个特殊值EOF。

1
2
3
4
5
6
7
int ch;
FILE * fp;
fp = fopen ("abc.txt", "r");
while ((ch = getc (fp)) != EOF)
{
putchar (ch);
}

feof()

int feof(FILE * stream);

会检查与文件对应流的eof( end of file )标志是否被设置,如果被设置则返回非零值,如未被设置,则返回0。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<stdio.h>

int main(void)
{
FILE *ptr = fopen("a.txt","r");

if(!ptr)
{
printf("打开文件失败!\n");
return -1;
}

char ch;
int count = 0 ;

while(!feof(ptr)) //检测到EOF标志则停止
{
count++;
ch = fgetc(ptr);
printf("%c",ch);
}
printf("%5d",count);
printf("\n");

fclose(ptr);
return 0;
}