Chinaunix首页 | 论坛 | 博客
  • 博客访问: 52823
  • 博文数量: 16
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 195
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-05 14:28
文章分类

全部博文(16)

文章存档

2013年(16)

我的朋友

分类: C/C++

2013-10-05 23:08:15

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);






阅读(1551) | 评论(0) | 转发(1) |
0

上一篇:关于预处理器

下一篇:嵌入式开发书籍

给主人留下些什么吧!~~