【APUE】标准io库

it2024-04-16  12

标准io库处理了很多细节,比如缓冲区的分配,以优化执行io

  在之前的文件io中,所有的操作都是围绕文件描述符展开的,而对于标准io库,他们的操作则是围绕着流展开的,当用一个标准io库打开或者创建一个文件时,我们已经使一个流与一个文件相关联。     缓冲 提供缓冲的目的是尽可能减少使用read和write的调用次数。 1.全缓冲:填满缓冲区后才进行实际io操作 2.行缓冲:当输入或者输出遇到换行符时执行io操作 3.不带缓冲:使出错信息可以尽快显示出来   一般的来说,出错信息是不带缓冲的,涉及到终端设备的其他流,是行缓冲的,其他情况下都是全缓冲的。 对于任何一个流,在打开该流的情况下,可以对流的类型进行改变, setbuf和setvbuf     在任何时候都可以强制冲刷一个流 int fflush(FILE *fp)       打开流 FILE *fopen(const char *restrict pathname, const char* restrict type); 打开一个指定的文件 FILE *fopen(const char *restrict pathname, const char* restrict type, FILE *restrict fp); 在一个指定的流上打开文件,若该流已经打开,就先关闭该流,若流已经定向,就先清除该定向,一般用于将一个文件打开为标准流 FILE *fdopen(int fieldes, const char *type); 获取一个现有的文件描述符(可以从open dup dup2 fcntl pipe socket socketpair accept函数中获取)并且使一个标准io流与之相结合。常用于由创建管道和网络通信管道函数返回的描述符。     用flose关闭一个流 关闭之前会冲洗缓冲区中的输出数据,丢弃缓冲区中的任何输入数据。若已经分配一个缓冲区,则释放该缓冲区。     读和写流 1)每次一个字符的io,如果流是带缓冲的,那么标准io函数会处理所有缓冲 一次读一个字符: int getc(FILE *fp); 可以实现为宏,参数必须是没有副作用的表达式 int fgetc(FILE *fp); 一定是一个函数,所以可以获得其地址 int getchar(void);      判断出错或者是到达文件尾端 int ferror(FILE *fp); in feof(FILE *fp); void clearerr(FILE *fp);     将字符再次压入流中 int ungetc(int c, FILE *fp); 会清除流的文件结束标志     一次写一个字符 int putc(int c, FILE *fp); int fputc(int c, FILE *fp); int putchar(int c);     2)每次一行io 读入: char *fgets(char *buf, int n , FILE *fp);  从指定的流读入 char *gets(char *buf);  从标准流读入, 不推荐使用,可能会导致溢出,并不将换行符存入缓冲区中。     输出: int fputs(const char* str, FILE *fp); int puts(const char *str);     3)二进制io size_t fread(void *ptr, size_t size, size_t nobj, FILE *fp); size_t fwite(const void *ptr, size_t size, size_t nobj, FILE *fp); 一般用于读或者写一个二进制数组或者结构体 float data[10]; fwrite(&data[2], sizeof(float), 4, fp); 返回读或者写的对象数       定位io流 1) long ftell(FILE *fp); int fseek(FILE *fp, long offset, int whence); void rewind(FILE *fp);将一个流设置到文件的起始位置   2) off_t ftello(FILE *fp); int fseeko(FILE *fp, off_t offset, int whence); 实现中可以将off_t定义长于32位   3) int fgetpos(FILE *fp, fpos_t pos); int fsetpos(FILE *fp, const fpos_t *pos); ISO C的标准,可以移植         格式化io printf int fprintf(FILE *fp, const char *format,.....); 写到指定的流 int sprintf(char *buf, const char* format,....); 写到指定的数组buf中,最后端自动加一个null字节,但是不包括在返回值中,可能会导致溢出 int spnprintf(char *buf, size_t n, const char* format,....); 安全的写入,超出缓冲区的都会被丢弃   同样也有读书函数 scanf int fscanf(char *buf, const char* format,....); int sscanf(const char *buf, size_t n, const char* format,....);      

转载于:https://www.cnblogs.com/w0w0/archive/2012/09/14/2685424.html

最新回复(0)