input
int fgetc ( FILE * stream ); int getc ( FILE * stream );int getchar ( void );
fgetc返回文件指针当前指定的字符,内部文件pos指向下一个字符。如果流到达了文件结果,函数将返回EOF(一般定义为-1,而字符类型是unsigned char,所以只能用int接收)
getc与fgetc作用一样,区别在于getc有可能实现为宏,因此,如果需要获得高效率,优先使用getc,如果需要传递文件指针,使用fgetc,因为宏是无法获取指针的。
getchar 文档定义为It is equivalent to calling with as argument
你也可以认为他是这样实现的
int getchar ( void ){ return getc(stdin);}
需要注意的是,这三个方法是运行于行缓冲模式的。行缓冲的输入结束判定为:要么行缓冲已满,要么遇到回车符。
而且这些函数不对内容进行处理,意思就是说当你键入1个字符并回车的时候,缓冲区里面其实是有两个字符的,一个是你输入的字符,一个是回车,回车是不会被丢弃的,在
下一次调用获取字符函数的时候,会当作字符返回。所以如果要获得你想要的输入,应该调用一个额外的getc丢弃回车符。(组织好差)
char * fgets ( char * str, int num, FILE * stream );char * gets ( char * str )
fgets从stream中获取字符,并在一下任一情况发生时停止:
1.读到新行
2.读完num-1个字符
3.读到文件结尾
并会设置地num个字符为\0.
也就是说fgets也是行缓冲的,也会遇到下面这种情况
myfile.txt
******************
12345678
test
******************
myfile.txt共有两行。
test.c
#include #include int main (){ FILE * file = fopen("myfile.txt","r"); char content[9]; fgets(content,9,file); printf("%s",content); fgets(content,9,file); printf("%s",content); system("pause"); return 0;}
输出为:
也就是第二次只会读取一个回车换行。
gets和fgets区别较大:
1.gets是从stdin读取
2.gets虽然也是遇到回车换行停止读取,但是它不会把回车换行放入读取的字符串中
3.没有指定str的长度。
第三点可能造成str的溢出,曾经被haker利用过。c11已经移除gets并用gets_s取代了gets
gets_s原型如下:
char*gets_s(char*str, rsize_t n );
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
fread是基于全缓冲的,也就不会说遇到换行就结束读取之类的。
output
int fputc ( int character, FILE * stream );int putc ( int character, FILE * stream );int putchar ( int character );
这几个方法没有什么好讲的,和输入不同,没有额外的限制。putc也是可能实现为宏。
int fputs ( const char * str, FILE * stream );int puts ( const char * str );
这两个函数的区别在于fputs不会将\0输出。而puts会在str后面自动加一个\n
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
buffer 是一个指针,指向要写入文件中的信息快。count的值指出要写多少项。返回写入项的数目,这个值永远等于count,除非操作失败。