区分C语言中fgetc、getc、getchar、fgets、gets

区分C语言中fgetc、getc、getchar、fgets、gets

作者:admin |  时间:2014-02-20 |  浏览:516 |  0 条评论

int fgetc ( FILE *stream );  //从流stream中读一个字符。可以将标准输入stdin作为它的实参,这时候从标准输入读取一个字符。 
int getc(FILE *stream);      //和fgetc等效,由fgetc通过宏实现。 
int getchar ( void );            //从标准输入stdin读入一个字符,程序等待你输入的时候,你可以输入多个字符,回车后程序继续执行。 
说明: 
getc、getchar都是通过宏定义借助fgetc实现。如getchar的实现为,#define getchar() fgetc(stdin)。 
 
char *fgets (char *str, int num, FILE *stream);   //从流stream中读入最多num个字符到字符数组str中,当遇到换行符时、或读到num-1个字符时停止。 自动加上'\0'空字符结尾 
char *gets ( char *str );   //从标准输入stdin读取一个字符串,遇到换行或结束时候终止。不同于fgets,他没有指定num,所以需要注意字符数组str的大小。 
 
说明: fgets和gets之间没有宏定义的关系,彼此各自有自己的实现。蠕虫病毒的实现就是函数gets的“功劳”。gets函数的任务是从流中读入一个字符串。它的调用者会告诉它把读入的字符串放在什么地方。但是,gets()函数并不检查缓冲区大小,如果调用者提供了一个指向堆栈的指针,并且get()函数读入的字符数量超过了超过了缓冲区的空间大小,get()会愉快地将多出来的字符继续写入到堆栈中,这就覆盖了堆栈中原来的内容。如: 
void main() 

    char line[512];    //在程序的堆栈上分配512个字符的空间 
    ... 
    gets(line);        //蠕虫病毒的入口,可以将恶意代码通过多出来的数据写入堆栈 

建议不要用getch和getche,因为它们不是C标准库中的函数。用它们写出的程序可移植性差,不同的编译器不保证可以包含conio.h。建议用fgets函数彻底替代gets函数。 

另外,绝大多数的这些get函数,都有对应的put版本。 
int fputc ( int character, FILE *stream ); 
int putc ( int character, FILE *stream );        //通过宏定义和fputc实现 
int putchar ( int character );   //通过宏定义实现:#define putchar(c) fputc(c, stdout) 
 
int fputs ( const char *str, FILE *stream ); 
int puts ( const char *str ); 
说明:两者之间无宏定义实现关系。puts(const char *str)近似等效于fputs(cosnt char *str, stdout),不同点是前者还输出一个'\n' 
 
最后,关于EOF 
EOF是在stdio.h文件中定义的符号常量,值为 -1。如, 
fputc函数返回一个值:如果输出成功则返回值就是输出的字符;如果输出失败,则返回一个EOF。 
fgetc函数读字符时遇到文件结束符,函数返回一个文件结束标记EOF。如果想从一个磁盘文件顺序读入字符并在屏幕上显示,可以: 
ch = fgetc(fp); 
while(ch != EOF) 

    putchar(ch); 
    ch = fgetc(fp); 

注意,EOF不是可输出字符,因此不能在屏幕上显示。由于ASCII码不可能出现 -1,因此EOF定义为 -1是合适的。当读入的字符值等于 -1(即 EOF)时,表示读入的已不是正常的字符,而是文件结束符。但以上只适用于读取文本文件的情况。现在ANSI C 已经允许用缓冲文件系统处理二进制文件,而读入某一个字节中的二进制数据的值有可能是 -1,而这又恰好是EOF的值。这就出现了需要读入有用数据,却处理为“文件结束”。feof(fp) 用来测试fp所指向的文件当前状态是否是“文件结束”。如果想顺序读入一个二进制文件数据,可以: 
while(!feof(fp)) 

    c = fgetc(fp); 
    ... 

相关推荐

发表评论

电子邮件地址不会被公开。

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>