zoukankan      html  css  js  c++  java
  • 标准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返回缓冲区地址和大小
    // 限制:创建的流只能打开,且不能自己指定缓冲区,关闭流后需要自行释放缓冲区,对流添加字节会增加缓冲区大小
  • 相关阅读:
    二十一.组合模式
    二十四.桥接模式
    二十六.职责链模式
    二十五.命令模式
    将小写转化成大写
    备份JOB SCHEDULE ENTRY的简单方法
    如何确定哪一个作业锁定QDLS下的一个目标
    WRKACTJOB命令一些有用功能介绍
    如何使用CA/400批处理的方式传输数据
    用前缀给字段命名
  • 原文地址:https://www.cnblogs.com/lnlin/p/10127733.html
Copyright © 2011-2022 走看看