一、函数原型
#include <stdio.h>
int fgetc(FILE *stream);
int getc(FILE *stream);
int getchar(void);
二、函数描述
一旦打开了流,则可在3种不同类型的非格式化I/O中进行选择,对其进行读、写操作。
(1)每次一个字符的IO。一次读或写一个字符,如果流是带缓冲的,则标准IO函数处理所有缓冲。
(2)每次一行的I/O。 如果想要一次读或写一行,则使用fgets和fputs.每行都以一个换行符终止。当调用fgets时,应说明能处理的最大行长。详见gets和fgets函数的区别
(3)直接I/O。 fread和fwrite函数支持这种类型的I/O。 每次I/O操作读或写某种数量的对象,而每个对象具有指定的长度。这两个函数常用于从二进制文件中每次读或写-一个结构。
直接1/O ( direct1/0)这个术语来自ISOC标准,有时也被称为:二进制I/O、一次一个对象 I/O、 面向记录的 I/O或面向结构的 1/O。
函数getchar等同于getc (stdin)。前两个函数的区别是,getc可被实现为宏,而fgetc不能实现为宏。这意味着以下几点。
(1) getc的参数不应当是具有副作用的表达式,因为它可能会被计算多次。
(2)因为fgetc 一定是个函数,所以可以得到其地址。这就允许将fgetc的地址作为一个参数传送给另一个函数。
(3)调用fgetc所需时间很可能比调用getc要长,因为调用函数所需的时间通常长于调用宏。
这3个函数在返回下一个字符时,将其unsigned char类型转换为int类型。说明为无符号的理由是,如果最高位为1也不会使返回值为负。要求整型返回值的理由是,这样就可以返回所有可能的字符值再加上一个已出错或已到达文件尾端的指示值。在<stdio. h>中的常量EOF被要求是一个负值,其值经常是-1。这就意味着不能将这3个函数的返回值存放在一一个字符变量中,以后还要将这些函数的返回值与常量EOF比较。
注意,不管是出错还是到达文件尾端,这3个函数都返回同样的值。为了区分这两种不同的情况,必须调用ferror或feof。
三、实例程序
#include <stdio.h>
int main ()
{
FILE *fp;
char c;
int i = 0;
fp = fopen("file.txt","r");
if(fp == NULL)
{
perror("打开文件时发生错误");
return(-1);
}
do
{
c = fgetc(fp);
if( feof(fp) )
{
break ;
}
printf("%d ", c);
}while(1);
fclose(fp);
return(0);
}
EOF只是代表一个整形常量-1。因此很多人认为在文件的末尾存在这个结束标志EOF,这种观点是错误的。事实上在文件的末尾是不存在这个标志的。
详见另外一篇文章 EOF是什么