1、字符I/O
int fgetc(FILE *stream);
int getc(FILE*stream);
int getchar(void);
getchar始终从标准输入读取,每个函数从流中读取下一个字符,并把它作为函数的返回值返回。如果流中不存在更多的字符,函数就返回常量EOF。
int fputc(int character,FILE*stream);
int putc(int character,FILE*stream);
int putchar(int character);
putchar在打印之前,函数吧这个整型参数裁剪为一个无符号字符型值,所以putchar('abc')只打印一个字符(至于是哪一个,不同的编译器可能不同)
fgetc和fputc都是真正的函数,但getc、putc、getchar和putchar都是通过#define指令定义的宏
2、撤销字符I/O
int ugetc(int character,FILE*stream);
ugetc把一个先前读入的字符返回流中,这样它可以在以后被重新读入。它从标准输入读取字符并把它们转换为一个整数。如果没有ugetc,这个函数将不得不把这个多余的字符返回给调用程序,后者负责把它发送到读取下一个字符的程序部分
/*
**把一串从标准输入读取的数字转换为整数
*/
#include
#include
int read_int()
{
int value;
int ch;
value=0;
/*
**转换从标准输入读入的字符,当我们得到一个非数字字符时就停止。
*/
while((ch=getchar())!=EOF&&isdigit(ch))
{
value+=10;
value+=ch-'0';
}
/*
**把非数字字符退回到流中,这样它就不会丢失
*/
ugetc(ch,stdin);
return value;
}
注意把字符退回到流中和写入到流中并不相同。写一个流想关联的外部存储并不受ugetc的影响。
3、未格式化的行I/O
char*fgets(char*buffer,int buffer_size,FILE*stream);
char*gets(char*buffer);
int fputs(char const*buffer,FILE*stream);
int puts(char const*buffer);
fgets从指定的stream读取字符并把它们复制到buffer,当它读取一个换行符并存储到缓冲区之后就不再读取。如果缓冲区内存储的字符数达到buffer_size-1个时它也停止读取。在这种情况下,并不会出现数据丢失的情况,因为下一次调用fgets将从流的下一个字符开始读取。在任何一种情况下,一个NUL字符将被添加到缓冲区所存储的末尾,使它成为一个字符串。
fputs:传递给fputs的缓冲区必须包含一个字符串,它的字符被写入到流中。这个字符串预期以NUL字节结尾,所以这个函数没有一个缓冲区长度参数,这个字符串是这样逐字写入的:如果他不包含一个换行符,就不会写入换行符。如果它包含了好几个换行符,所有的换行符都会被写入。因此,当fgets每次都读取一整行时,fputs却既可以一次写入一行的一部分,也可以一次写入一整行,甚至可以一次写入好几行。如果写入时出现了错误,fputs返回常量值EOF,否则它将返回一个非负值。
gets和puts函数几乎和fgets与fputs相同。之所以存在它们是为了允许向后兼容。它们之间的一个主要的功能性区别在于当gets读取一行输入时,它并不在缓冲区中存储结尾的换行符。当puts写入一个字符串时,它在字符串写入之后向输出再添加一个换行符。
另一个区别在于gets,这从函数的原型中就清晰可见:它没有缓冲区长度参数。因此gets无法判断缓冲区的长度。如果一个长输入行读入到一个短的缓冲区,多出来的字符将被写入到缓冲区后面的内存位置,这将破坏一个或多个不相关的变量的值。
4、格式化的行I/O
输入:
int fsanf(FILE*stream,char const*format,...);
int scanf(char const*format,...);
int sscanf(char const *string,char const*format,...);
输出:
int fprintf(FILE*stream,char const*format,...);
int printfchar const*format,...);
int sprintf(char const *string,char const*format,...);
5、二进制I/O
size_t fread(void *buffer,size_t size,size_t count,FILE*stream);
size_t fwrite(void *buffer,size_t size,size_t count,FILE*stream);
刷新和定位函数:
int fflush(FILE*stream);
long ftel(FILE* stream);
int fseek(FILE *stream,long offset,int from);
阅读(544) | 评论(0) | 转发(0) |