zoukankan      html  css  js  c++  java
  • 6标准文件读写

    标准文件库


    查询文件属性
    <sys/types.h>
    <sys/stat.h>
    int stat(const char *filename, struct stat *buf)
    获取文件属性
    int fstat(int fd, struct stat *buf)
    功能同stat,但是入参是文件描述符
    int lstat(const char *filename, struct stat *buf)
    功能同 stat,但是能处理链接文件


    查询文件属性
    struct stat
    dev_t st_dev //设备ID
    mode_t st_mode //文件类型与权限(ls显示的 –rwx------)
    nlink_t st_nlink //文件链接数
    uid_t st_uid //文件所有人 ID
    gid_t st_gid //文件所属组 ID
    off_t st_size //文件大小
    time_t st_atime //最近访问时间(access)
    time_t st_mtime //最近修改时间(modify)
    time_t st_ctime //文件状态最近改变时间(change)

    查询文件属性
    文件类型
    S_IFREG 普通文件 -
    S_IFDIR 目录文件 d
    S_IFCHR 字符文件 c
    S_IFBLK 块文件 b
    S_IFIFO 管道文件 p
    S_IFLNK 符号链接 l
    S_IFSOCK 套接字文件 s
    S_IFMT 掩码
    判断方法: if (st_mode & S_IFMT)

    查询文件属性
    宏判断, 返回 0或者1
    S_ISREG(st_mode) /* 判断是否为普通文件 - */
    S_ISDIR(st_mode) /* 判断是否为目录文件 d */
    S_ISCHR(st_mode) /* 判断是否为字符文件 c */
    S_ISBLK(st_mode) /* 判断是否为块文件 b */
    S_ISFIFO(st_mode) /* 判断是否为管道文件 p */
    S_ISLNK(st_mode) /* 判断是否为符号链接 l */
    S_ISSOCK(st_mode) /*判断是否位套接字文件*/

    文件访问权限属性
    S_IRUSR S_IWUSR S_IXUSR
    S_IRGRP S_IWGRP S_IXGRP
    S_IROTH S_IWOTH S_IXOTH

    if (st_mode & S_IRUSR)
    r w x usr grp oth 权限和使用者

    事实上,这些宏,只是把 000 000 000 这个 9 个bit位的数字,对应位置置位位1 (高位补0)。
    S_IRUSR = 0400 S_IWUSR = 0200 S_IXUSR =0100
    S_IRGRP = 0040 ...


    查询文件系统相关信息
    #include <sys/statfs.h> 或者下面这个
    #include<sys/vfs.h>
    int statfs(const char *path, struct statfs *buf)
    int fstatfs(int fd, struct statfs *buf)
    结构体解析:
    struct statfs
    long f_type; /* 文件系统类型 */
    long f_bsize; /* 经过优化的传输块大小 */
    long f_blocks; /* 文件系统数据块总数 */
    long f_bfree; /* 可用块数 */
    long f_bavail; /* 非超级用户可获取的块数 */
    long f_files; /* 文件结点总数 */
    long f_ffree; /* 可用文件结点数 */
    fsid_t f_fsid; /* 文件系统标识 */
    long f_namelen; /* 文件名的最大长度 */

    文件操作
    #include<stdio.h>
    FILE* fopen(const char* filename, const char* mode)
    打开文件
    FILE* freopen(const char* filename, const char* mode, FILE* stream)
    文件重定向, 操作 stream文件时候,实际操作的是 filename文件
    int fclose(FILE* stream)
    关闭文件
    int remove(const char *filename)
    删除文件
    int rename(const char *oldname, const char * newname)
    重命名文件


    freopen 文件流重定向
    FILE *pFile
    pFile= freopen(“1.txt”, “w”, stdout)
    所有输出到stdout的内容被输出到 1.txt
    pFile = freopen(“1.txt”, “r”, stdin)
    所有有stdin输入的地方,变成从 1.txt 输入

    注意:输出到stdout等同于写入文件,输入到stdin等同于读取文件
    stdin=fopen("/dev/tty","r")
    stdout=fopen("/dev/tty","w")

    stdin表示控制台读这个文件,就相当于scanf();
    stdout表示控制台写这个文件,相当于printf();


    重定向类似与管子,一边是stdin或stdout,另一边是文件。
    当文件打开并与stdout连通时,以下两句等效:
    fprintf(stdout,"this is write1 ");
    fprintf(file,"this is write2 ");


    例子:
    #include <stdio.h>

    //写入文件
    void test_freopen()
    {
    fprintf(stdout,"this is test! ");
    FILE *file=freopen("1.txt","w",stdout);
    if(file==NULL)
    {
    return ;
    }
    fprintf(stdout,"this is write1 ");
    fprintf(file,"this is write2 ");

    fclose(file);
    printf("this is end ");
    }
    //读取文件
    void test_freopen2()

    {
    char buf[1024];
    scanf("%s",buf);
    printf("your input is %s ",buf);
    FILE *file=freopen("1.txt","r",stdin);
    if(file==NULL)
    {
    return ;
    }
    scanf("%s",buf);
    printf("your input is %s ",buf);
    fclose(file);

    }

    void main()
    {
    test_freopen();
    test_freopen2();
    }

    标准文件操作(与C语言一样)
    标准输入
    int getc(FILE *stream)
    从文件流中读取字符,宏定义方式,效率高,括号里面不要进行运算
    int fgetc(FILE *stream)
    从文件中读取字符,函数定义形式,效率比getc()低
    int getchar(void)
    从stdin 读入一个字符, 事实上,就是 getc(stdin)

    char *gets(char *s)
    从stdin 中读取字符存入 s,返回NULL或者s地址
    char *fgets(char *s, int n, FILE *stream)
    加入流长度控制

    注意:fgetc(file)返回值是 int,不是 char,因为char类型的一个字符是255,此时可能会多出一个未知字符
    buf=(fgetc(file))!=EOF 返回 EOF = int(-1) = 0xffffffff 时表示读取结束

    标准输出
    putchar(int c)
    putc(int c, FILE *stream)
    fputc(int c, FILE *stream)
    区别联系类似 getc, getchar, fgetc
    前缀 f 就是 function的意思

    行输出:以 ‘’ 结束输出
    int puts(const char *s)
    int fputs(const char *s, FILE *stream

    块读写
    size_t fread(void *ptr, size_t size, size_t nBlock, FILE *stream)
    size_t fwrite(const void *ptr, size_t size, size_t nBlock, FILE *stream)
    块读写可存储结构体。,第三参数表示存储块的数目。


    例子:
    #include <stdio.h>
    typedef struct CWR
    {
    int x;
    int y;
    char buf[8];
    }CWR;

    void test_freopen()
    {
    FILE *file=fopen("1.txt","w");
    if(file==NULL)
    {
    return ;
    }

    CWR wr[]={{1,2,"Hello"},{3,4,"World"}};
    fwrite(&wr,sizeof(CWR),2,file);

    fclose(file);
    }

    void test_freopen2()

    {
    FILE *file=fopen("1.txt","r");
    if(file==NULL)
    {
    return ;
    }
    CWR wrr;
    fread(&wrr,sizeof(CWR),1,file);
    printf("%d %d %s ",wrr.x,wrr.y,wrr.buf);

    fread(&wrr,sizeof(CWR),1,file);
    printf("%d %d %s ",wrr.x,wrr.y,wrr.buf);

    fclose(file);
    }
    void main()
    {
    test_freopen();
    test_freopen2();
    }


    注意:以下的格式化多用于合并字符,
    如:str="sprintf","操作";
    int sprintf(strr, "操作%s", str);
    那么,strr="操作sprintf";

    格式化输出
    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, ...);
    格式控制
    %3d 右对齐输出(左边填空格)
    %-3d 左对齐 (右边填空格)
    %+d 带符号输出( +, -)
    % d 带符号输出(空格,-)
    %#x 进制输出带前缀(0, 0x

    格式化输入
    int scanf(const char *format, ...)
    int fscanf(FILE *stream, const char* format, ...)
    int sscanf(const char* s, const char* format, ...)


    文件读写与定位
    int fseek(FILE *stream, long offset, int whence);
    SEEK_SET SEEK_END SEEK_CUR
    long ftell(FILE *stream);
    void rewind(FILE *stream);
    int fgetpos(FILE *stream, fpos_t *pos);
    int fsetpos(FILE *stream, fpos_t *pos);


    文件状态
    ferror(FILE*)
    发生IO错误 返回非0,正常返回0
    feof(FILE*)
    文件结束EOF返回非0, 否则返回0
    clearer(FILE*)
    清除IO错误标志和 EOF标志

    获取错误信息
    char* strerror(errno)
    返回当前错误信息
    printf(“There is a error[%s]:%s ”, “MY”, strerror(errno))
    头文件 errno.h string.h
    perror(char *);
    在里面集成了 strerror(errno),
    这个里面不支持我们输出参数

    文件缓冲
    BUFSIZ 缓冲区大小的宏,256的整数倍
    void setbuf(FILE*, char *buf)
    把文件缓冲区设置位 buf, 这里buf大小位 BUFSIZ
    buf为NULL则关闭缓存
    int setvbuf(FILE*, char *buf, int type, size_t size)
    指定缓冲区位置(buf)和大小(size)
    type 指定缓冲模式
    _IOFBF:全缓冲: 普通文件读写,缓冲区满时写入文件,读出文件直到缓冲区满
    _IOLBF:行缓冲: 遇到换行(‘ ’)刷新缓冲区, stdout, stdin
    _IONBF:无缓冲: 所有IO直接执行, stderr
    int fflush(FILE *);
    强制刷新缓冲区


    变长参数使用
    #include<stdarg.h>
    va_list 定义变量列表变量
    va_start 获取变量列表起始地址
    va_arg 获取变量,同时指向下一个变量
    va_end 结束变量获取,释放句柄(清零变量)
    vsprintf/vsnprintf 从变量列表里依次格式化取变量

    记录日志函数 WriteLog(char *pFmt, ...)

  • 相关阅读:
    dynamic debug动态打印
    leetcode:Pascal's Triangle II (杨辉三角形,空间限制)【面试算法题】
    HDU 1671 Phone List 二叉树水题 数组建树法
    栈和队列
    一张图理解O(1)算法
    uva 10608
    C# 写的工作任务 Job 定时调度框架 WebWork (Quartz.NET) Web版的Windows服务
    PHP伪造referer突破防盗链
    php 文件上传一例简单代码
    PHP 图片文件上传代码
  • 原文地址:https://www.cnblogs.com/gd-luojialin/p/9215943.html
Copyright © 2011-2022 走看看