标准I/O库

Posted lnlin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了标准I/O库相关的知识,希望对你有一定的参考价值。

设置流的定向:

#include <stdio.h>
#include <wchar.h>

// 流的定向决定了所读、写的字符是单字节(字节定向)还是多字节的(宽定向)
// 若流是宽定向的返回正值,若流是字节定向的返回负值,若流未定向,返回0
int fwide(FILE *fp, int mode);
// fp: 与要被设置流的定向的文件相关的流
// mode取值决定fwide()如何工作:
// mode为正,指定为宽定向;mode为负,指定为字节定向;mode为0,不做任何设置,仅仅返回标识该流的定向

缓冲区操作:

缓冲类型
全缓冲:在填满I/O缓冲区后才进行实际的I/O操作
行缓冲:在I/O中遇到换行符时,标准I/O库才执行I/O操作
行缓冲的限制是无法得知在执行实际的I/O操作时是因为换行符还是其他原因
不带缓冲:标准I/O库不对字符进行缓冲存储
ISO C要求的缓冲特征:
仅当标准输入和标准输出并不指向交互式设备时,他们才是全缓冲
标准错误不会是全缓冲
一般情况下,标准错误不带缓冲,指向终端的流为行缓冲,其他为全缓冲

#include <stdio.h>

// 成功返回0,出错返回-1
void setbuf(FILE *fp, char *buf);
// fp是一个打开着的,与将被操作的文件相关的流
// buf指向一个长度为BUFSIZ的缓冲区或者为NULL
// 当buf为NULL时表示关闭缓冲机制
// 当buf不为NULL时,表示打开缓冲机制,但具体是何种缓冲取与fp相关

void setvbuf(FILE *fp, char *buf, int mode, size_t size);
// setvbuf()可以精确设置所需的缓冲类型
// mode为 _IOFBF为全缓冲
// mode为 _IOLBF为行缓冲
// mode为 _IONBF为不带缓冲,此时忽略buf和size参数
// buf和size用于指定一个缓冲区及其长度
// 若buf为NULL,但该流带缓冲,则缓冲区由标准I/O库分配,长度为BUFSIZ

// 强制冲洗一个缓冲区
int fflush(FILE *fp);

流的打开与关闭:

#include <stdio.h>

// 成功返回文件指针,出错返回NULL
FILE *fopen(const char *path, const char *type);
// path指定被打开的文件路径
// type指定对该I/O流的读写方式

FILE *freopen(const char *path, const char *type, FILE *fp);
// 在一个指定的流(fp)上打开一个文件,若该流已经打开,则先关闭该流,若该流已经定向,则清除该定向 

FILE *fdopen(int fd, const char *type);
// 为一个现有的文件描述符(fd)打开一个相关的流,一般用于那写无法用fopen()打开的特殊文件

// 成功返回0,出错返回EOF
int fclose(FILE *fp);
// 关闭一个打开着的流

对流进行读写:

#include <stdio.h>

// 一次读取一个字符
// 成功返回下一个字符,出错或到达文件尾端,返回EOF
int getc(FILE *fp);
int fgetc(FILE *fp);
int getchar();
// 关于返回值问题:
// 由于在<stdio.h>中的常量EOF被要求是一个负值,且其值经常为-1,不论是出错还是到达文件
// 尾端,他们的返回值都一样,所以为了区分这两种情况,必须调用ferror()、feof()

// 将一个字符压送回流缓冲区
// 成功返回c,出错返回EOF
int ungetc(int c, FILE (fp);

// 向指定流写入一个字符
// 成功返回c,出错返回EOF
int putc(int c, FILE *fp);
int fputc(int c, FILE *fp);
int putchar(int c);

// 每次从指定流读取一行
// 成功返回buf,出错返回NULL
char *fgets(char *buf, int n, FILE *fp);
// n为buf长度
char *gets(char *buf);
// 弃用,可能造成缓冲区溢出

// 向指定流输出一行
// 成功返回非负值,出错返回EOF
int fputs(const char *str, FILE *fp);
int puts(const char *str);

// 二进制I/O:
// 返回读、写的对象数
size_t fread(void *ptr, size_t size, size_t nobj, FILE *fp);
size_t fwrite(const void *ptr, size_t size, size_t nobj, FILE *fp);
// nobj 为将被读写的对象个数

对流进行定位:

#include <stdio.h>

// 成功返回当前文件位置,出错返回-1
long ftell(FILE *fp);
off_t ftello(FILE *fp);

// 设置文件偏移量
// 成功返回0,出错返回-1
int fseek(FILE *fp, long offset, int whence);
int fseeko(FILE *fp, off_t offset, int whence);

void rewind(FILE *fp);

// 获取、设置文件位置
// 成功返回0,出错返回-1
int fgetpos(FILE *fp, fpos_t *pos);
int fsetpos(FILE *fp, fpos_t *pos);
// pos用于存放文件位置指示器的值

创建临时文件:

#include <stdio.h>

// 返回指向唯一路径名的指针
char *tmpnam(char *ptr);
// ptr为NULL时,该路径名存放在一个静态区中
// ptr不为NULL时,则认为它是指向长度至少是L_tmpnam个字符的数组
// 一般在程序中使用时,使用tmpnam()返回的路径值创建一个文件,并对它使用unlink()

// 创建一个临时二进制文件,在关闭该文件或程序结束时自动删除此文件
// 成功返回文件指针,出错返回NULL
FILE *tmpfile(void);

// SUS为处理临时文件定义的函数
#include <stdlib.h>

// 成功返回指向目录名的指针,出错返回NULL
char *mkdtemp(char *template);

// 成功返回文件描述符,出错返回-1
int mkstemp(char *template);

// 名字是通过template字符串选择的,template是的后6位被设置为XXXXXX路径名

内存流:

#include <stdio.h>
#include <wchar.h>

// 打开一个内存流
// 成功返回流指针,出错返回NULL

FILE *fmemopen(void *buf, size_t size, const chat *type);
// buf指向缓冲区开始位置,size指定缓冲区大小,type指定如何使用流,类似用打开文件时的type

FILE *open_memstream(char **bufp, size_t *sizep);
// 创建的流面向字节的
FILE *open_wmemstream(wchar_t **bufp, size_t *sizep);
// 创建的流面向宽字节
// 通过bufp、sizep返回缓冲区地址和大小
// 限制:创建的流只能打开,且不能自己指定缓冲区,关闭流后需要自行释放缓冲区,对流添加字节会增加缓冲区大小

 









以上是关于标准I/O库的主要内容,如果未能解决你的问题,请参考以下文章

标准I/O库

第五章 标准I/O

Linux 标准 I/O 库

APUE---标准I/O库

标准I/O库 笔记

标准I/O库[奇牛学院]