zoukankan      html  css  js  c++  java
  • 文件I/O学习笔记一

    12月29号

     缓冲:

    全缓冲-----

    标准I/0 是高级磁盘I/0(基于文件I/0的一个封装)

    写数据:

    按字符读写:   getc               putc

                                   Getchar            putchar

    按行读写:     fgets               fputs

                   遇\0 返回    注意缓冲区定义为  char buff[N];

    按指定大小:   fread (返回值为读到的多少个元素)              fwrite (buf ,对象块(指定元素的大小),指定元素的个数,stream) 

    文件I/0

    1. 低级磁盘I/0,会引起系统调用,无缓冲,文件描述符来访问{0,1,2}
    2. 文件描述符 是一个非负整数

    系统调用函数:

    1.打开  int   open(path ,flags)  功能:打开一个文件。。。。。。创建只能创建普通文件。。。。

    flags权限{  (宏的组合)

    O_RDONLY   只读方式,文件必须存在;

    O_WRONLY  只写方式,文件必须存在;     r+

    O_CREAT    创建,    !!!!!必须指定文件的权限{怎么确定文件访问权限? Mode  & (~umask)文件掩码   /etc/profile    文件权限掩码:umank  022}; 

    O_RDWR    读写方式

    O_TRUNC    截止, 如打开一文件,如果存在,先删除文件中原有数据。。。

    O_APPEND  追加文件末尾

    }}

    r   =è   open(path, O_RDONLY)

    r+  =è   open(path ,  O_RDWR)

    W  ==è   open(path,  O_WRONLY  |  O_CREAT  |  O_TRUNC,0666) 

    W+  =è   open(path,  O_RDWR  |  O_CREAT  |  O_TRUNC ,0666 )

    a  =è  open(path,  O_WRONLY  |  O_CREAT  |  O_APPEND,  0666 )  只写追加,不存在则创建

    a+  =è  open(path,   O_RDWR  |  O_CREAT  | O_APPEND  ,0666)

    open  成功则返回一个新的文件描述符,失败返回  -1;

    1. close  关闭文件描述符

    读写:

    1.read  (fds, buf ,size_t)   char  buff[N];

    Read 成功 返回读取的字节n <=size   n==0时  读取到文件末尾。。。。

    2.写:write (fdest,buf, n ) n为read成功读取的数据的字节

    定位函数:lseek只对常规文件有效,不会引起任何I/O操作,即磁盘操作。。。。不能操作socket、FIFO和管道等文件

    lseek (fd, offset, whence)   fd  =èfp->_fileno  获取fd文件描述符!!!!!!!

    offset 偏移量 正向前,,,,负,向后

    whence{  宏。。。。

             SEEK_SET

    SEEK_CUR

    SEEK_END

    }

    文件位偏移量可以大于文件的当前长度,在这种情况下,对对该文件的操作会延长文件,形成空洞。。。。。

    空洞?

    作用:可以造成多点下载·····

    1. 函数

    ①     access(path ,R_OK)  测试函数的执行权限  F_OK 测试文件是否存在。。。。。。

    成功返回0,失败返回-1.。。。。。。。。。。

    ②     umask(mode_t  mode) 只对当前文件有效。。。

    ③     chmod (path , mode_t  mode) 修改文件的权限

    fchmod(fd,  mode_t  mode)

    ④     chown (path ,  uid_t  owner,  gid_t  group)更改文件的用户ID和组ID

    ⑤     truncate(path,  off_t  length)  文件末端处截取一些数据以缩短文件

    ftruncate(fd,  off_t  length)

    删除文件:

    unlink

    remove

    int  rename(const  char  *old, const  char  * new)

    链接:

    ①     软链接ln  –s   (创建一个快捷方式,新建一个_inode_nero,指向一块相应的块的位子,这个块存放的是原_inode的路径、地址)

    ②     硬链接  ln  filename  newfilenema 

    目录项中添加一个新的目录,使它们都指向同一个地方的节点。。。。。

    ls  - i   查看文件的_inode 的编号。。。。。

    目录文件中存放的是。

    每种文件系统对应都有一个超级块--------系统启动时,双向循环链表

    每个文件 都有一个 _inode节点(包含文件信息)-----修改时间,大小,用户ID/组ID。

    _inode 中存在一个指向文件所在位子(块)的指针。。。。。。

    ③     重点掌握 _inode节点。。。。。

    stat()

    fstat

    lstat(path,  struct  stat  *buf) 将path的信息写入内存缓冲区中。。。。。。怎么传参呢?先定义一个struct  stat  buf; 然后 将&buf  传参。。。可以使用点操作符buf.st_ino  访问inode

    vim  -t  st_mode。。。。。。   crtl +右括号 进入需要查找的宏

    *****重点  (如何取得文件类型----检测宏)

    st_mode (unsigned  int类型  32位)  怎么判断倒数第3位是1或者0????

    文件类型----进程-----user------group------other  一共16位 

    4位       3位    3位    3位    3位

    1 1 1 1   0 0 0    0 0 0    0 0 0     0 0 0  和 0170000(S_IFREG)相与

    取得件类型打印―――检测宏

    #include <stdio.h>

    #include <unistd.h>

    #include <sys/types.h>

    #include <sys/stat.h>

    #include <time.h>

    #include <grp.h>

    #include <pwd.h>

    int main(int argc, char *argv[])

    {

        struct stat buf;

        struct tm *tp;

        int n;

     

        lstat(argv[1], &buf);

     

        switch(buf.st_mode & S_IFMT)

        {

        case S_IFBLK:   printf("b"); break;

        case S_IFCHR:   printf("c"); break;

        case S_IFDIR:   printf("d"); break;

        case S_IFREG:   printf("-"); break;

        case S_IFLNK:   printf("l"); break;

        case S_IFSOCK:  printf("s"); break;

        case S_IFIFO:   printf("p"); break;

        }

        for(n=8; n>=0; n--)

        {

            if(buf.st_mode & (1 << n))

            {

                switch(n%3)

                {

                case 2: printf("r"); break;

                case 1: printf("w"); break;

                case 0: printf("x"); break;        

                }

            }

            else

                printf("-");

        }

        printf(" %02d ", buf.st_nlink);

     

        printf("%s ", getpwuid(buf.st_uid)->pw_name); 

        printf("%s ", getgrgid(buf.st_gid)->gr_name);

        printf("%8ld  ", buf.st_size);

       

        tp = localtime(&buf.st_mtime);

     

        printf("%d-%2d-%2d  %02d:%02d:%02d", tp->tm_year+1900, tp->tm_mon+1, tp->tm_mday,\

                                tp->tm_hour, tp->tm_min, tp->tm_sec);

        printf(" %s\n", argv[1]);

     

        return 0;

    }

     

  • 相关阅读:
    mysql--SQL编程(关于mysql中的日期) 学习笔记2
    mysql--SQL编程(基础知识) 学习笔记1
    Geocoding java调用百度地图API v2.0 图文 实例( 解决102错误)
    java unicode转码为中文 实例
    spring hiberante 集成出现异常 java.lang.ClassNotFoundException: org.hibernate.engine.SessionFactoryImplementor
    [Spring学习笔记 7 ] Spring中的数据库支持 RowMapper,JdbcDaoSupport 和 事务处理Transaction
    [Spring学习笔记 6 ] Spring JDBC 详解
    ubuntu 连接windows远程桌面 &&rdesktop 退出全屏模式
    maven Missing artifact com.sun:tools:jar:1.5.0
    mysql 常用命令,连接数据库,查看建表语句,批量导入数据,批量更新数据,连接查询
  • 原文地址:https://www.cnblogs.com/zhou2011/p/2306895.html
Copyright © 2011-2022 走看看