码迷,mamicode.com
首页 > 其他好文 > 详细

Unix环境之标准IO库

时间:2015-06-19 18:47:32      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:unix环境   io流   

UNIX的文件IO都是针对文件描述符的,而标准IO的操作则是围绕流进行的。当一个流最初被创建时,它并没有定向。若在未定向的流上使用一个多字节IO函数,则将该流的定向设置为宽定向;若在未定向的流上使用一个单字节IO函数,则将该流的定向设置为字节定向。
stdio.h定义了三个标准流,stdin、stdout和stderr,分别是标准输入、标准输出和标准出错。

缓冲——

标准IO库提供缓冲的目的是尽可能减少使用read和write调用的次数。它也对每个IO流自动地进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的麻烦。标准IO提供了三种类型的缓冲:
1、全缓冲。这种情况下,在填满标准IO缓冲区后才进行实际IO操作。
2、行缓冲。在这种情况下,当在输入和输出中遇到换行符时,标准IO库执行IO操作。
3、不带缓冲。标准IO库不对字符进行缓冲存储。标准出错流stderr通常是不带缓冲的,这就使得出错信息可以尽快显示出来,而不管它们是否含有一个换行符。
调用下列函数可更改缓冲类型:

#include <stdio.h>
void setbuf(FILE *stream, char *buf);
int setvbuf(FILE *stream, char *buf, int mode, size_t size);

调用fflush函数可强制冲洗一个流:

#include <stdio.h>
int fflush(FILE *stream);

当一个进程正常终止时,直接调用exit函数,或从main函数返回,则所有带未写缓冲数据的标准IO流都会被冲洗,所有打开的标准IO流都会被关闭。

流操作——

下面三个函数可以打开一个标准IO流:

#include <stdio.h>
FILE* fopen(const char *path, const char *mode);
FILE* fdopen(int fd, const char *mode);
FILE* freopen(const char *path, const char *mode, FILE *stream);

流可分为非格式化IO和格式化IO,前者又分为字符IO、行IO和二进制IO,后者如常见的prntf和scanf等。
fclose函数关闭一个打开的流:

#include <stdio.h>
int fclose(FILE *fp);

fwide函数可以设置流的定向:

#include <wchar.h>
int fwide(FILE *stream, int mode);

与出错或到达文件尾端相关的函数:

#include <stdio.h>
int ferror(FILE *stream);
int feof(FILE *stream);
void clearerr(FILE *stream);

流定位——

#include <stdio.h>
int ftell(FILE *stream);
int fseek(FILE *stream, long offset, int whence);
void rewind(FILE *stream);
int fgetpos(FILE *stream, fpos_t *pos);
int fsetpos(FILE *stream, fpos_t *pos);
off_t ftello(FILE *stream);
int fseeko(FILE *stream, off_t offset, int whence);

字符IO——

#include <stdio.h>
int getc(FILE *stream);
int fgetc(FILE *stream);
int getchar(void);
int ungetc(int c, FILE *stream);

int putc(int c, FILE *stream);
int fputc(int c, FILE *stream);
int putchar(int c);

行IO——

#include <stdio.h>
char* gets(char *s);
char* fgets(char *s, int size, FILE *stream);
int puts(const char *s);
int fputs(const char *s, FILE *stream);

二进制IO——

#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

常见的格式IO——

#include <stdio.h>
int printf(const char *format, …);
int fprintf(FILE *stream, const char *format, ...);
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);

#include <stdarg.h>
int vprintf(const char *format, va_list ap);
int vfprintf(FILE *stream, const char *format, va_list ap);
int vsprintf(char *str, const char *format, va_list ap);
int vsnprintf(char *str, size_t size, const char *format, va_list ap);

#include <stdio.h>
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);

#include <stdarg.h>
int vscanf(const char *format, va_list ap);
int vsscanf(const char *str, const char *format, va_list ap);
int vfscanf(FILE *stream, const char *format, va_list ap);

标准IO不足——

标准IO库的一个不足之处是效率不高,这与它需要复制的数据量有关。当使用每次一行函数fgets和fputs时,通常需要复制两次数据:一次是在内核和标准IO缓冲之间(当调用read和write时),第二次是在标准IO缓冲区和用户程序中的行缓冲区之间。而快速IO库则避免了这一点,其方法是使读一行的函数返回指向该行的指针,而不是将该行复制到另一个缓冲区。

Unix环境之标准IO库

标签:unix环境   io流   

原文地址:http://blog.csdn.net/ieearth/article/details/46563623

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!