狐狸梦见乌鸦

当坚持成为一种习惯,目标将不在遥远```
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

文件I/O学习笔记一

Posted on 2011-12-30 07:16  灬啊U  阅读(204)  评论(0编辑  收藏  举报

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;

}