pag111
流定向决定了所读、写的字符是单字节还是多字节的。
int fwide(FILE *fp, int mode);//设置流定向
文件描述符:
STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO
文件指针:
stdin、stdout、stderr
默认缓冲机制
标准出错---------------------不带缓冲
终端设备流------------------行缓冲
其他流-----------------------全缓冲
行缓冲限制:
1、只要填满了缓冲区,即使没有写一换行符,也进行IO操作。
2、任何时候只要通过标准IO库要求从(a)一个不带缓冲的流,或者(b)一个行缓冲的流(要求从内核得到数据)的到输入数据,那么会造成冲洗所有行缓冲输出流(fgets,gets等循环调用会冲洗输出流)
void setbuf(FILE *restrict fp, char *restrict buf);//更改缓冲类型
int setvbuf(FILE *restrict fp, char *restrict buf, int mode, size_t size);//_IOFBF/_IOLBF/_IONBF
如果要使用改变缓冲类型函数,则要在 打开流后并且在对该流执行任何操作之前
int fflush(FILE *fp);//强制冲洗一个流(fd=NULL,冲洗所有输出流)
FILE * fopen(const char *restrict pathname, const char *restrict type);//打开标准IO流,指定文件
FILE * freopen(const char *restrict pathname, const char *restrict type, FILE *restrict fd);//在指定流上打开指定文件,
此函数一般用于将一个指定的文件打开为一个预定义的流:标准输入、标准输出、标准出错
FILE * fdopen(int filedes, const char *type);//获取现有描述符与一个标准IO流结合(与fileno相对)(open,dup,dup2,fcntl,pipe,socket,socketpair,ept获得描述符),不能截断他为写而打开的任一文件
当以读和写类型打开一文件时(+)具有以下限制:(
此限制不是很理解)
1、如果中间没有fflush、fseek、fsetpos、rewind,则在输出的后面不能直接跟随输入
2、如果中间没有fseek、fsetpos、rewind,或者一个输出操作没有到达文件尾端,则在输入操作之后不能直接跟随输出
int fclose(FILE *fp);//关闭一个打开的流
int getc(FILE *fp);//getchar 等价于getc(stdin)
int fgetc(FILE *fp);
int getchar(FILE *fp);
int ferror(FILE *fp); //出错检查
int feof(FILE *fp); //文件结束检查
int ungetc(int c, FILE *fp);//将字符压送回流中
压送回流中的字符以后可以从流中读出,但读出字符的顺序与压送回的顺序相反。不能回送EOF。一次成功的ungetc调用会清除该流的文件结束标志。(有时需要先看下一个字符,以决定如何处理当前字符时有用)
int putc(int c, FILE *fp);
int fputc(int c, FILE *fp);
int putchar(int c);
char * fgets(char *restrict buf, int n, FILE *restrict fp);//读取n-1个字符,自行添加NUL
char * gets(char *buf);
int fputs(const char *restrict str, FILE *restrict fp);
int puts(const char *str);
gets----------不保留换行符 puts----------------添加换行符
fgets----------保留换行符 fputs---------------不添加换行符
getc---------可实现为宏
so:getc的参数不应当时具有副作用的表达式。
fgetc--------一定时个函数
so:可得到其地址,fgetc的地址可做为参数。
EOF类型为int,所以单字符获取函数的返回值为int型,定义变量时要注意定义为int型,否则可能无法检测出EOF错误。
二进制IO(
前提)
size_t fread(void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp);
size_t fwrite(const void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp);
定位流
long ftell(FILE *fp);
int fseek(FILE *fp, long offset, int whence);
void rewind(FILE *fp);
int fgetpos(FILE *restrict fp, fpos_t *restrict pos);
int fsetpos(FILE *fp, const fpos_t *pos);
pag121
格式化IO
int printf(const char *restrict format, ...);
int fprintf(FILE *restrict fp, const char *restrict format, ...);
int sprintf(char *restrict buf, const char *restrict format, ...);//
在尾端自动添加NUL,该字节不包括在返回值中
int snprintf(char *restrict buf, size_t n, const char *restrict format, ...);
转换说明:
%[flags][fldwidth][precision][lenmodifier]convtype
fldwidth:转换的最小字段宽度。如少则用空格填充。
precision:说明
整形转换后最少输出数字位数、
浮点数转换后小数点后的最少位数、
字符串转换后的最大字符数。精度是一个句点(.),后接一个可选非负十进制整数或一个星号。(
字符是限制,其他类型是规定最小标准)
int vprintf(const char *restrict format, va_list arg);
int vfprintf(FILE *restrict fp, const char *restrict format, va_list arg);
int vsprintf(char *restrict buf, const char *restrict format, va_list arg);
int vsnprintf(char *restrict buf, size_t n, const char *restrict format, va_list arg);
int scanf(const char *restrict format, ...);
int fscanf(FILE *restrict fp, const char *restrict format, ...);
int sscanf(const char *restrict buf, const char *restrict format, ...);
转换说明:
%[*][fldwidth][lenmodifier]convtype
fldwidth:最大宽度(最大字符数)
int scanf(const char *restrict format, va_list arg);
int vfscanf(FILE *restrict fp, const char *restrict format, va_list arg);
int vsscanf(char *restrict buf, const char *restrict format, va_list arg);
pag125
int fileno(FILE *fp); //获取与流相关连的文件描述符
临时文件
char * tmpnam(char *ptr);//产生一个与现有文件名不同的一个有效路径名字符串
FILE * tmpfile(void);//创建临时二进制文件,在关闭文件或程序结束时自动删除该文件
常用标准技术:先调用tmpnam产生一个唯一的路径名,然后用该路径名创建一个文件,并立即unlink它(链接计数为0)(关闭时引用计数为0,此时才删除其内容)
char * tempnam(const char *directory, const char *prefix);//为产生的路径名指定目录和前缀,prefix最多包含5个字符的字符串
按序判断:
1、如果定义了环境变量TMPDIR,则用其作为目录
2、如果参数directory非NULL,则用其作为目录
3、将中的字符串P_tmpdir用作目录
4、将本地目录(通常是/tmp)用作目录
int mkstemp(char *template);//创建临时文件,返回打开的文件描述符(不会自动删除,要调用unlink)